Consultas XPath: Ejemplos Prácticos
Este documento presenta una serie de ejemplos prácticos de consultas XPath, cubriendo una variedad de funciones y operadores. Cada ejemplo incluye una breve descripción y el código XPath correspondiente.
Selección Básica
Mostrar los títulos de los libros con la etiqueta «titulo»:
for $titulo in /bookstore/book/title/text() return <titulo>{$titulo}</titulo>
Filtrado de Resultados
Mostrar los libros cuyo precio sea menor o igual a 30 (dos formas):
Forma 1 (usando
where
):for $libro in doc("books.xml")/bookstore/book where $libro/price <= 30 return $libro
Forma 2 (usando XPath directo):
for $libro in /bookstore/book[price<=30] return $libro
Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30 (dos formas):
Forma 1 (usando
where
):for $libro in /bookstore/book where $libro/price <= 30 return $libro/title
Forma 2 (usando XPath directo):
for $libro in /bookstore/book[price<=30] return $libro/title
Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o igual a 30:
for $libro in /bookstore/book[price<=30] return <title>{$libro/title/text()}</title>
Selección con Condiciones Específicas
Mostrar el título y el autor de los libros del año 2005, y etiquetar cada uno de ellos con «lib2005»:
for $libro in /bookstore/book where $libro/year=2005 return <lib2005>{$libro/title}{$libro/author}</lib2005>
for $libro in /bookstore/book where $libro/year=2005 return <lib2005>{$libro/title}{$libro/author}</lib2005>
Uso de for
y let
Mostrar los años de publicación (dos formas, para ilustrar la diferencia entre
for
ylet
). Etiquetar la salida con «publicacion»:Con
for
:for $year in /bookstore/book/year return <publicacion>{$year}</publicacion>
Con
let
:let $year := /bookstore/book/year return <publicacion>{$year}</publicacion>
Nota: Con
for
, se itera sobre cada año individualmente. Conlet
, se asigna toda la secuencia de años a la variable$year
.
Ordenación de Resultados
Mostrar los libros ordenados primero por «category» y luego por «title» en una sola consulta:
for $libro in /bookstore/book order by $libro/@category,$libro/title return $libro
Nota:
@
se utiliza para acceder a los atributos de un elemento.
Funciones de Agregación
Mostrar cuántos libros hay, y etiquetarlo con «total» (dos formas):
Forma 1 (usando
let
):let $num_libro := count(/bookstore/book) return <total>{$num_libro}</total>
Forma 2 (usando
for
– menos eficiente):for $x in doc("books.xml")/bookstore/book return <total>{count(/bookstore/book)}</total>
Mostrar los títulos de los libros y al final una etiqueta con el número total de libros:
let $total := count (/bookstore/book), $titulos := ( for $libro in /bookstore/book/title return <titulo>{$libro/text()}</titulo>) return <resultado> {$titulos} <total_libros>{$total}</total_libros> </resultado>
Mostrar el precio mínimo y máximo de los libros:
let $max := max(/bookstore/book/price), $min := min(/bookstore/book/price) return <resultado> <max>{$max}</max> <min>{$min}</min> </resultado>
Mostrar la suma total de los precios de los libros con la etiqueta «total»:
let $libros := /bookstore/book return <total>{sum($libros/price)}</total>
Mostrar cada uno de los precios de los libros, y al final una nueva etiqueta con la suma de los precios:
<libros> { for $libros in /bookstore/book return $libros/price } { let $libros := /bookstore/book return <total>{sum($libros/price)}</total> } </libros>
Cálculos y Formato de Salida
Mostrar el título del libro, su precio y su precio con el IVA incluido (21%), cada uno con su propia etiqueta. Ordénalos por precio con IVA (dos formas):
Forma 1 (con variable
$precio_iva
):for $libro in /bookstore/book let $precio_iva := ($libro/price * 1.21) order by $precio_iva return <libro> <titulo>{$libro/title/text()}</titulo> <precio>{$libro/price/text()} €</precio> <precio_iva>{$precio_iva} €</precio_iva> </libro>
Forma 2 (calculando directamente en
order by
):for $libro in /bookstore/book order by $libro/price * 1.21 return <libro> <titulo>{$libro/title/text()}</titulo> <precio>{$libro/price/text()} €</precio> <precio_iva>{$libro/price * 1.21} €</precio_iva> </libro>
Contando Elementos y Combinando Resultados
Mostrar el título y el número de autores que tiene cada título en etiquetas diferentes:
for $libros in /bookstore/book return <libro> {$libros/title} <autores>{count($libros/author)}</autores> </libro>
Mostrar en la misma etiqueta el título y entre paréntesis el número de autores que tiene ese título:
for $libros in /bookstore/book return <libro>{$libros/title/text()} ({count($libros/author)})</libro>
Funciones de Cadena
Mostrar los libros escritos en años que terminen en «3» (dos formas):
Forma 1 (usando
where
):for $libros in /bookstore/book where ends-with($libros/year, "3") return $libros
Forma 2 (usando XPath directo):
for $libros in /bookstore/book[ends-with(year, "3")] return $libros
Mostrar los libros cuya categoría empiece por «C» (dos formas):
Forma 1 (usando
where
):for $libros in /bookstore/book where starts-with($libros/@category, "C") return $libros
Forma 2 (usando XPath directo):
for $libros in /bookstore/book[starts-with(@category, "C")] return $libros
Mostrar los libros que tengan una «X» (mayúscula o minúscula) en el título (dos formas, aunque la segunda forma es más correcta):
Forma 1 (incorrecta, buscando «t»):
for $libros in /bookstore/book where contains(lower-case($libros/title), "t") return $libros
Forma 2 (correcta, buscando «x»):
for $libros in /bookstore/book[contains(lower-case(title), "x")] return $libros
Mostrar el título y el número de caracteres que tiene cada título, cada uno con su propia etiqueta:
for $libros in /bookstore/book return <libro> {$libros/title} <length>{string-length($libros/title)}</length> </libro>
Funciones de Eliminación de Duplicados y Ordenación
Mostrar todos los años en los que se ha publicado un libro eliminando los repetidos. Etiquétalos con «año»:
for $años in distinct-values(/bookstore/book/year) return <año>{$años}</año>
Mostrar todos los autores eliminando los que se repiten y ordenados por el número de caracteres que tiene cada autor:
for $autores in distinct-values(/bookstore/book/author) order by string-length($autores) return <autor>{$autores}</autor>
Salida en formato HTML
- Mostrar los títulos en una tabla de HTML:
{$libros/title/text()} |