EXERCICIS RESOLTS XQUERY
XML
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
CONSULTES
Nota: En las respuestas pondré la consulta (para después poder copiar y pegar) un
recorte de la consulta (para que quede más estético con sus colores y eso) y un
recorte del resultado obtenido.
1. Mostrar los títulos de los libros con la etiqueta "titulo".
for $x in //title/data()
return concat('<titulo>', $x ,'</titulo>')
2. Mostrar los libros cuyo precio sea menor o igual a 30. Primero incluyendo la
condición en la cláusula "where" y luego en la ruta del XPath.
for $x in /bookstore/book for $x in /bookstore/book[price<=30]
where $x//price<=30 return $x
return $x
El resultado en ambos casos es el mismo:
3. Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30.
for $x in /bookstore/book
where $x//price<=30
return $x/title
4. Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o igual
a 30.
for $x in /bookstore/book
where $x//price<=30
return $x/title/text()
5. Mostrar el título y el autor de los libros del año 2005, y etiquetar cada uno de
ellos con "lib2005".
for $x in //book
where $x/year='2005'
return <lib2005>{$x/title}{$x/author}</lib2005>
6. Mostrar los años de publicación, primero con "for" y luego con "let" para
comprobar la diferencia entre ellos. Etiquetar la salida con "publicacion".
for $x in //year let $x := //year
return return
<publicacion>{$x}</publicacion> <publicacion>{$x}</publicacion>
La cláusula let permite asignaciones de variables y evita repetir la misma expresión muchas
veces. La cláusula let no da lugar a la iteración. En cambio la clausula for es un bucle,
devuelve el resultado para todas las iteraciones.
7. Mostrar los libros ordenados primero por "category" y luego por "title" en una
sola consulta.
for $x in //book
order by $x/@category, $x/title
return $x
8. Mostrar cuántos libros hay, y etiquetarlo con "total".
let $x := /bookstore/count(book)
return <total>{$x}</total>
9. Mostrar los títulos de los libros y al final una etiqueta con el número total de
libros.
let $total := count (//book),
$titulos := (for $libro in //title return $libro)
return
<resultado>
{$titulos}
<total_libros>{$total}</total_libros>
</resultado>
10. Mostrar el precio mínimo y máximo de los libros.
let $min := min(//price),
$max := max(//price)
return
<precios_libros>
<precio_minimo>{$min}</precio_minimo>
<precio_maximo>{$max}</precio_maximo>
</precios_libros>
11. Mostrar el título del libro, su precio y su precio con el IVA incluido, cada uno
con su propia etiqueta. Ordénalos por precio con IVA.
Aplicare un IVA del 4%:
IVA superreducido (4%): es aplicado a los productos de primera necesidad como el
pan, la leche, las frutas, los cereales y los quesos. Otros productos con este tipo de
IVA superreducido son los LIBROS, periódicos y revistas no publicitarios,
medicamentos, sillas de ruedas, protesís y VPO.
for $libro in //book
let $precio_iva := round($libro/price/text()*1.04,2)
order by $precio_iva
return
<libro>
<titulo>{$libro/title/text()}</titulo>
<precio>{$libro/price/text()}</precio>
<precio_con_iva>{$precio_iva}</precio_con_iva>
</libro>
12. Mostrar la suma total de los precios de los libros con la etiqueta "total".
let $precio := //price
return <total>{sum($precio)}</total>
13. Mostrar cada uno de los precios de los libros, y al final una nueva etiqueta con
la suma de los precios.
let $total := sum(//price),
$precio := (for $libro in //price return $libro)
return
<precios>
{$precio}
<precio_total>{$total}</precio_total>
</precios>
14. Mostrar el título y el número de autores que tiene cada título en etiquetas
diferentes.
for $x in //book
return
<libros>
{$x/title}
<num_autores>{count($x/author)}</num_autores>
</libros>
15. Mostrar en la misma etiqueta el título y entre paréntesis el número de autores
que tiene ese título.
for $x in //book
return
<libros>{$x/title/data()}({count($x/author)})</libros>
16. Mostrar los libros escritos en años que terminen en "3".
for $x in //book
where ends-with($x/year,'3')
return $x
17. Mostrar los libros cuya categoría empiece por "C".
for $x in //book
where starts-with($x/@category,'C')
return $x
18. Mostrar los libros que tengan una "X" mayúscula o minúscula en el título.
for $x in //book
where contains(lower-case($x/title),'x')
return $x
19. Mostrar el título y el número de caracteres que tiene cada título, cada uno con
su propia etiqueta.
for $x in //book
return
<libro>
{$x/title}
<longitud>{string-length($x/title/data())}</longitud>
</libro>
20. Mostrar todos los años en los que se ha publicado un libro eliminando los
repetidos. Etiquétalos con "año".
for $x in distinct-values(//year)
return <año>{$x}</año>
21. Mostrar todos los autores eliminando los que se repiten y ordenados por el
número de caracteres que tiene cada autor.
for $x in distinct-values(//author)
order by string-length($x)
return $x
22. Mostrar los títulos en una tabla de HTML.
<table>
{
for $titulo in //title
return <tr>{$titulo/text()}</tr>
}
</table>