Las consultas en XPath nos permitirán acceder y mostrar información concreta de un documento XML. Podremos utilizar funciones numéricas, de nodo, de posición etc. crear consultas anidadas y mucho más ¡Vamos a comenzar!
Fichero de ejemplo
Los siguientes ejemplos los ejecutaremos con la herramienta gratuita BaseX y utilizaremos el fichero XML de ejemplo de artículos anteriores.
Localización
El direccionamiento o la localización es una ruta de nodos de un documento XML. Esto nos permitirá ir seleccionando aquellas partes que nos interese obtener. Tenemos el Absoluto donde siempre le indicamos el nodo raíz, y el Relativo donde no se le especifica el nodo raíz. Usamos la siguientes expresiones:
Expresión | Definición |
---|---|
nodo | Elemento que tiene por nombre nodo |
/nodo | Se encuentra en la raíz del documento |
nodo1/nodo2 | Nodo2 es hijo directo nodo1 |
nodo1//nodo2 | Nodo 2 es hijo de nodo1, pero puede haber otros intermedios |
//nodo | Nodo puede estar en cualquier lugar debajo de nodo raiz |
@atributo | Atributo que tiene por nombre atributo |
* | Cualquier elemento |
@* | Cualquier atributo |
. | Nodo actual |
.. | Nodo padre |
Ejemplos
Mostrar todo el contenido de la biblioteca escribiendo el nodo raíz:
biblioteca
En este otro ejemplo comprobamos como especificamos la localización absoluta para obtener del nodo raíz biblioteca, sus libros y sus autores:
/biblioteca/libro/autor
Podriamos obtener exactamente el mismo resultado con la localización relativa. Por ejemplo:
//libro/autor //autor
Si quisiéramos obtener el ID, que es un atributo del libro (que no es lo mismo que los elementos del libro) utilizamos la siguiente expresión:
/biblioteca/libro/@id
Otra opción es mostrar todos los atributos de todos los nodos:
//@*
Otra opción muy útil es poder mostrar los resultados pero sin las etiquetas correspondientes. Usaremos la función text() que nos traerá el valor del nodo sin la etiqueta. Por ejemplo, vamos a mostrar los autores pero sin la etiqueta de autor:
/biblioteca/libro/autor/text()
Filtrar
También se puede filtrar el conjunto de nodos o la propia información utilizando condiciones. El filtro se debe especificar siempre entre corchetes y podemos utilizar los siguientes operadores y funciones (se muestran las más relevantes):
Operadores
Operador | Descripción |
---|---|
and | Y |
or | O |
not | No es |
= | Igual |
!= | Diferente |
< | Menor que |
> | Mayor que |
<= | Menor o igual que |
>= | Mayor o igual que |
to | Rango |
+ | Suma |
– | Resta |
* | Multiplicación |
div | División |
mod | Resto de la división |
| | Unión de resultados |
En este ejemplo vamos a mostrar tanto el título como el precio usando el operador de unión:
/biblioteca/libro/(titulo|precio)
Otro ejemplo usando operadores puede ser mostrar los libros cuyo año sea menor de 2023:
/biblioteca/libro[fecha<2023]/titulo
Funciones de cadena
Función | Descripción | Ejemplo |
---|---|---|
starts-with() | Cadena comienza | starts-with(‘XML’, ‘X’) = true |
ends-with() | Cadena termina | ends-with(‘XML’, ‘X’) = false |
substring() | Extracción de cadena | substring(‘MiguelTroyano’, 1, 6) = Miguel |
contains() | La cadena contiene | contains(‘XML’, ‘ML’) = true |
normalize-space() | Espacios normalizados | normalize-space(‘ Doc XML ‘) = ‘Doc XML’ |
string-length() | Contar caracteres | string-length(‘MiguelTroyano’) = 13 |
upper-case() | Convertir en minusculas | upper-case(‘xml’) = ‘XML’ |
lower-case() | Convertir en mayúsculas | lower-case(‘XML’) = ‘xml’ |
translate() | Sustitución de cadena | translate(‘Doc XML’, ‘XML’, ‘XPAth’) = ‘Doc XPAth’ |
Funciones numéricas
Función | Descripción | Ejemplo |
---|---|---|
round() | Redondeo | round(3.88) = 3 |
abs() | Valor absoluto | abs(-8) = 8 |
floor() | Redondeo hacia abajo | floor(8.3) = 8 |
ceiling | Redondeo hacia arriba | ceiling(8.3) = 9 |
Funciones de posición de elementos
Función | Descripción |
---|---|
position() = n | Nodo que se encuentra en la posición ‘n’ |
elemento[n] | Nodo en la posición ‘n’ de los que se llaman nodo |
last() | El último nodo de un conjunto |
last() – i | El último menos i nodos |
En este ejemplo vamos a mostrar el título del libro que ocupa la posición 3:
/biblioteca/libro[position()=3]/titulo
No solo tenemos porque quedarnos con una posición, también podemos mostrar varias. En este ejemplo nos quedamos con la posición de la 2 a la 3:
/biblioteca/libro[position()=2 to 3]/titulo
Funciones de nodos
Función | Descripción |
---|---|
comment() | Comentarios del nodo |
empty() | Si el nodo está vacío o no |
exists() | Si existe el nodo o no |
name() | Nombre del nodo actual |
node() | Nodos descendientes del actual |
processing-instruction() | Instrucciones de procesamiento |
root() | Elemento raíz |
text() | Contenido textual del nodo |
En este ejemplo mostramos únicamente el nombre de los nodos descendientes del actual:
/biblioteca/libro/node()/name()
Funciones de agregación
Función | Descripción |
---|---|
avg() | Media |
count() | Contar |
max() | Valor máximo |
min() | Valor mínimo |
sum() | Suma |
En este ejemplo podemos ver como realizar la suma de los precios de cada libro:
sum(/biblioteca/libro/precio/text())
Consultas combinadas
Con todo lo anterior podemos crear consultas mucho más complejas como las consultas anidadas. En el siguiente ejemplo buscaremos el autor del libro «Datos en la Web» y después se mostrarán todos los libros de dicho autor:
/biblioteca/libro[autor=/biblioteca/libro[titulo="Datos en la Web"]/autor/text()]/titulo