PRÁCTICA 2.
XPATH
Crea una colección llamada prueba y sube los ficheros
departamentos.xml y empleados.xml
Consultas da un pantallazo de la salida
1. //DEPT_NO
Devuelve todos los números de departamento, 18 filas,
porque recoge todos los departamentos de la coleccion
2. /*/DEPT_NO
Selecciona las etiquetas dept_no que están a un nivel de
profundidad en este caso ninguna
3. /*/*/DEPT_NO
Selecciona las etiquetas dept_no que están a dos niveles
profundidad desde la raiz
4. /departatamentos/*
Selecciona las etiquetas que van dentro de la etiqueta
departamentos y sus subetiquetas
5. /*
6. /empleados/emp_row[dept_no=10]
Selecciona todos los elementos o nodos dentro de
emp_row de los empleados del departamento 10
7. /
empleados/emp_row/apellido|/empleados/emp_row/d
ept_no
Selecciona los nodos apellido y dept_no de los
empleados
8. /empleados/emp_row[dept_no=10]/apellido/text()
Selecciona los apellidos de los empleados del
departamento 10
9. /empleados/emp_row[not(dept_no=10)]
Selecciona los empleados que no son del departamento
10
10. /
empleados/emp_row[not(oficio=’ANALISTA’)]/apellido/
text()
Selecciona los apellidos de los empleados que no son
analistas
11.
/EMPLEADOS/EMP_ROW[DEPT_NO=10]/APELLIDO|/EM
PLEADOS/EMP_ROW[DEPT_NO=10] /OFICIO
Selecciona el apellido y el oficio de los empleados del
dept_no 10
12. //*[DEPT_NO=10]/DNOMBRE/text()
Las dos devuelven el nombre del departamento 10
/departamentos/DEP_ROW[DEPT_NO=10]/DNOMBRE/text()
13. //*[OFICIO='EMPLEADO' ]//EMP_ROW
/EMPLEADOS/EMP_ROW[ OFICIO='EMPLEADO' ] //EMP_ROW
Devuelve los empleados con oficio empleado, por cada
empleado devuelve todos sus elementos, busca en cualquier
parte de la colección.
Ambas devuelven lo mismo
14. /EMPLEADOS/EMP_ROW[SALARIO>1300 and
DEPT_NO=10]
Devuelve los datos de los empleados con salario mayor
de 1300 y del departamento
15. /EMPLEADOS/EMP_ROW[SALARIO>1300 and
DEPT_NO=20]/APELLIDO |
/EMPLEADOS/EMP_ROW[SALARIO>1300 and
DEPT_NO=20]/OFICIO
Devuelve el lapellido y el oficio de los empleados con
salario mayor de 1300 y del departamento 20, se usa el
separador | para unir las rutas
Las siguientes consultas pon enunciado y da un pantallazo de la
salida.
16. /EMPLEADOS/EMP_ROW[1]
Todos los datos del primer empleado
17. / EMPLEADOS/EMP_ROW[5]/APELLIDO/text()
Apellido del quinto empleado
18. /EMPLEADOS/EMP_ROW[last()]
Todos los datos del último empleado
19. /EMPLEADOS/EMP_ROW[last()-1] /APELLIDO/text()
Datos del penúltimo empleado
20. /EMPLEADOS/EMP_ROW[position()=3]
Obtiene los elementos del empleado que ocupa la posición 3
21. /EMPLEADOS/EMP_ROW[position()<3]/APELLIDO
Selecciona el apellido de los elementos cuya posición sea menor
que 3, es decir devuelve los apellidos del primer y segundo
elemento.
22. /EMPLEADOS/count(EMP_ROW) número de empleados
23. /EMPLEADOS /count(EMP_ROW[DEPT_NO=10])
Cuenta el número de empleados del departamento 10
24.
/EMPLEADOS/count(EMP_ROW[DEPT_NO=10 and
OFICIO='EMPLEADO'])
25. /*[count(DEP_ROW)=4] elementos que tienen 4 hijos
DEP_ROW, devolverá la etiqueta departamento y todas sus sub
etiquetas
26. sum(/EMPLEADOS/EMP_ROW/SALARIO)
dev la suma del salario, si la etiqueta a sumar la considera string
hay que convertirla a número usando la función number
27. sum(/EMPLEADOS/EMP_ROW[DEPT_NO=20]/SALARIO)
suma de los salarios de los empleados del dpt 20
28. max(/EMPLEADOS/ EMP_ROW/SALARIO) dev salario máximo
29. min(/EMPLEADOS/ EMP_ROW/SALARIO) dev salario mínimo
30. min(/EMPLEADOS/
EMP_ROW[OFICIO=”ANALISTA”]/SALARIO) sal mínimo de los
empleados de oficio analista
31. avg(/EMPLEADOS/ EMP_ROW/SALARIO) salario medio
32. avg(/EMPLEADOS/ EMP_ROW[DEPT_NO=20]/SALARIO)
salario medio de los empl del dpto. 20
33. //*[name()='APELLIDO'] dev todos los apellidos entre sus
etiquetas
34. count(//*[name()='APELLIDO'])cuenta las etiquetas con
nombre apellido
35. /
EMPLEADOS/EMP_ROW[DEPT_NO=10]/concat(APELLIDO,"-",OF
ICIO) dev el apellido y el oficio concatenado del departamento
10
36. /
EMPLEADOS/EMP_ROW/concat(APELLIDO,"-",OFICIO,"-",SALAR
IO) concatena apellido oficio y salario de todos los empleados
37. /EMPLEADOS/EMP_ROW[starts-with(APELLIDO,'A')]
Obtiene los elementos de los empleados cuyo apellido empieza
por A
38. /EMPLEADOS/EMP_ROW[starts-
with(OFICIO,'A')]/concat(APELLIDO,"-",OFICIO)
Obtiene el apellido y nombre concatenado de los empleados cuyo
oficio empieza por A
39. /EMPLEADOS/EMP_ROW[contains(OFICIO,'OR')]/OFICIO
Obtiene los oficios que contienen la silaba OR
40. /EMPLEADOS/EMP_ROW[contains(APELLIDO,'A')]/APELLIDO
Apellidos que contienen una A
41. /EMPLEADOS/EMP_ROW/concat(APELLIDO,'=',string-
length(APELLIDO))
Dev concatendados el apellido con su numero de caracteres
42. /EMPLEADOS/EMP_ROW[string-length(APELLIDO)<4]
Los datos de los empleados cuyo apellido tiene menos de 4
caracteres
43. /
EMPLEADOS/EMP_ROW/concat(APELLIDO,',',SALARIO,'-',SALARI
O div 12) dev los datos concatenados de apellido, salario y el
salario dividido por 12
44. sum(/EMPLEADOS/EMP_ROW/SALARIO) div
count(/EMPLEADOS/EMP_ROW)
dev la suma de los salarios dividido por el contador de
empleados
45. /
EMPLEADOS/EMP_ROW/concat(APELLIDO,',',SALARIO,'-',SALARI
O mod 12) dev los datos concatenados de apellido y salario y el
resto de dividir salario entre 12
46. /EMPLEADOS/EMP_ROW[(SALARIO mod 12 )=4]
Dev los datos de los empleados cuyo resto de dividor el salario
entre 12 sea igual a 4
Nodos atributos
Un nodo atributo no se considera un nodo hijo, sino como etiquetas
añadidas al nodo elemento.
El elemento departamento tiene dos atributos teléfono y tipo y el
elemento empleado tiene el atributo salario, para referirnos a los
atributos se usa el @ antes del nombre.
Sube el fichero universidad.xml dentro de la colección prueba
Las siguientes consultas pon enunciado y da un pantallazo de la
salida.
47. /universidad/departamento[@tipo]
Obtener los datos de los departamentos que tengan el atributo tipo,
si ponemos entre paréntesis de data nos devulve los datos sin las
etiquetas
data(/universidad/departamento[@tipo])
48. /universidad/departamento/empleado[@salario]
Obtener los datos de los departamentos que tengan el
atributo salario, si ponemos entre paréntesis de data nos
devuelve los datos sin las etiquetas
49. /universidad/departamento[@telefono=”990033"]
data(/universidad/departamento[@telefono=990033"])
Obtener los datos de los departamentos que tengan el teléfono
50. /
universidad/departamento[@telefono=”990033"]/nombre/te
xt()
Obtner el nombre del departamento cuyo teléfono es 990033
51.//departamento[@tipo='B']
Los datos de los departamentos cuyo tipo es b
52./universidad/departamento[@tipo='A']/empleado
Los datos de los empleados del departamento tipo A
53./universidad/departamento/empleado[@salario>"2100"]
Datos de los empleados cuyo salario >2100
54./universidad/departamento/empleado[@salario>"2100"]/nomb
re/text()
Nombre de los empleados cuyo salario >2100
55./universidad/departamento/empleado[@salario>"2100"]/conca
t(nombre,' ',@salario)
Datos concatenados del empleado y su salario de los empleados
cuyo salario es >2100
56./universidad/departamento[@tipo="A"]/count(empleado)
Número de empleados que hay en los departamentos tipo A
57./universidad/departamento[@tipo="A"]/concat(nombre,'
',count(empleado))
Devuelve por cada departamento tipo A, la concatenación de su
nombre y número de empleados
58. /universidad/departamento/concat(nombre,'
',count(empleado))
Devuelve el numero de empleados por cada depart
59. sum(/universidad/departamento/empleado/@salario)
Es lo mismo que sum(//empleado/salario)
Devuelve la suma total del salario de todos los empleados
60. /universidad/departamento/concat(nombre,' total=',
sum(empleado/@salario))
Por cada dept la concatenación de su nombre y el total del salario
61. min(//empleado/@salario) salario minimo de todos lo
empleados
62./universidad/departamento/concat(nombre,'Minimo=',
min(empleado/@salario))
Por cada departamento obtiene la concatenación de su nombre y el
mínimo salario
63./universidad/departamento/concat(nombre,'Maximo=',
max(empleado/@salario))
Por cada departamento obtiene la concatenación de su nombre y el
máximo salario
64. /universidad/departamento/concat(nombre,' Media=',
avg(empleado/@salario))
Por cada departamento obtiene la concatenación de su nombre y la
media de su salario
65. /universidad/departamento[count(empleado)>3] datos de los
departamentos con mas de 3 empleados
/universidad/departamento[count(empleado)>3]/nombre/text()
Nombre de los departamentos de más de 3 empleados
66. /universidad/departamento[@tipo="A" and
count(empleado)>2]/nombre/text()
Nombre de los departamentos tipo a y con mas de dos empleados