Consultas en XPath

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ónDefinición
nodoElemento que tiene por nombre nodo
/nodoSe encuentra en la raíz del documento
nodo1/nodo2Nodo2 es hijo directo nodo1
nodo1//nodo2Nodo 2 es hijo de nodo1, pero puede haber otros intermedios
//nodoNodo puede estar en cualquier lugar debajo de nodo raiz
@atributoAtributo 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

OperadorDescripción
andY
orO
notNo es
=Igual
!=Diferente
<Menor que
>Mayor que
<=Menor o igual que
>=Mayor o igual que
toRango
+Suma
Resta
*Multiplicación
divDivisión
modResto 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ónDescripciónEjemplo
starts-with()Cadena comienzastarts-with(‘XML’, ‘X’) = true
ends-with()Cadena terminaends-with(‘XML’, ‘X’) = false
substring()Extracción de cadenasubstring(‘MiguelTroyano’, 1, 6) = Miguel
contains()La cadena contienecontains(‘XML’, ‘ML’) = true
normalize-space()Espacios normalizadosnormalize-space(‘ Doc XML ‘) = ‘Doc XML’
string-length()Contar caracteresstring-length(‘MiguelTroyano’) = 13
upper-case()Convertir en minusculasupper-case(‘xml’) = ‘XML’
lower-case()Convertir en mayúsculaslower-case(‘XML’) = ‘xml’
translate()Sustitución de cadenatranslate(‘Doc XML’, ‘XML’, ‘XPAth’) = ‘Doc XPAth’

Funciones numéricas

FunciónDescripciónEjemplo
round()Redondeoround(3.88) = 3
abs()Valor absolutoabs(-8) = 8
floor()Redondeo hacia abajofloor(8.3) = 8
ceilingRedondeo hacia arribaceiling(8.3) = 9

Funciones de posición de elementos

FunciónDescripción
position() = nNodo 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() – iEl ú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ónDescripció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ónDescripció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

Escribir un comentario