Bloque de consultas XQuery 1
Dado el siguiente documento XML realiza las siguientes consultas con XQuery (se eliminan las tildes para evitar problemas de compatibilidad de caracteres):
<?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>
- Mostrar los títulos de los libros con la etiqueta "titulo".
for $titulo in /bookstore/book/title/text() return <titulo>{$titulo}</titulo>
- 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 $libro in /bookstore/book where $libro/price <= 30 return $libro
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.
for $libro in /bookstore/book where $libro/price <= 30 return $libro/title
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>
- 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>
- 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 $year in /bookstore/book/year return <publicacion>{$year}</publicacion>
let $year := /bookstore/book/year return <publicacion>{$year}</publicacion>
- 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
- Mostrar cuántos libros hay, y etiquetarlo con "total".
let $num_libro := count(/bookstore/book) return <total>{$num_libro}</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 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.
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>
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>
- 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 $libro in /bookstore/book return $libro/price } { let $libros := /bookstore/book return <total>{sum($libros/price)}</total> } </libros>
- Mostrar el título y el número de autores que tiene cada título en etiquetas diferentes.
for $libro in /bookstore/book return <libro> {$libro/title} <autores>{count($libro/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 $libro in /bookstore/book return <libro>{$libro/title/text()} ({count($libro/author)})</libro>
- Mostrar los libros escritos en años que terminen en "3".
for $libro in /bookstore/book where ends-with($libro/year, "3") return $libro
for $libro in /bookstore/book[ends-with(year, "3")] return $libro
- Mostrar los libros cuya categoría empiece por "C".
for $libro in /bookstore/book where starts-with($libro/@category, "C") return $libro for $libro in /bookstore/book[starts-with(@category, "C")] return $libro
- Mostrar los libros que tengan una "X" mayúscula o minúscula en el título ordenados de manera descendente.
for $libro in /bookstore/book where contains($libro/title, "x") or contains($libro/title, "X") order by $libro/title descending return $libro
for $libro in /bookstore/book where contains(lower-case($libro/title), "x") order by $libro/title descending return $libro
for $libro in /bookstore/book[contains(lower-case(title), "x")] order by $libro/title descending return $libro
- Mostrar el título y el número de caracteres que tiene cada título, cada uno con su propia etiqueta.
for $libro in /bookstore/book return <libro> {$libro/title} <length>{string-length($libro/title)}</length> </libro>
- Mostrar todos los años en los que se ha publicado un libro eliminando los repetidos. Etiquétalos con "año".
for $año in distinct-values(/bookstore/book/year) return <año>{$año}</año>
- Mostrar todos los autores eliminando los que se repiten y ordenados por el número de caracteres que tiene cada autor.
for $autor in distinct-values(/bookstore/book/author) order by string-length($autor) return <autor>{$autor}</autor>
- Mostrar los títulos en una tabla de HTML.
<table> { for $libro in /bookstore/book return <tr> <td>{$libro/title/text()}</td> </tr> } </table>
Bloque de consultas XQuery 2
Dado el siguiente documento XML realiza las siguientes consultas con XQuery (se eliminan las tildes para evitar problemas de compatibilidad de caracteres):
<?xml version="1.0" encoding="UTF-8"?> <bailes> <baile id="1"> <nombre>Tango</nombre> <precio cuota="mensual" moneda="euro">27</precio> <plazas>20</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Roberto Garcia</profesor> <sala>1</sala> </baile> <baile id="2"> <nombre>Cha-cha-cha</nombre> <precio cuota="trimestral" moneda="euro">80</precio> <plazas>18</plazas> <comienzo>1/2/2011</comienzo> <fin>31/7/2011</fin> <profesor>Miriam Gutierrez</profesor> <sala>1</sala> </baile> <baile id="3"> <nombre>Rock</nombre> <precio cuota="mensual" moneda="euro">30</precio> <plazas>15</plazas> <comienzo>1/3/2011</comienzo> <fin>1/12/2011</fin> <profesor>Laura Mendiola</profesor> <sala>1</sala> </baile> <baile id="4"> <nombre>Merengue</nombre> <precio cuota="trimestral" moneda="dolares">75</precio> <plazas>12</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Jesus Lozano</profesor> <sala>2</sala> </baile> <baile id="5"> <nombre>Salsa</nombre> <precio cuota="mensual" moneda="euro">32</precio> <plazas>10</plazas> <comienzo>1/5/2011</comienzo> <fin>1/12/2011</fin> <profesor>Jesus Lozano</profesor> <sala>2</sala> </baile> <baile id="6"> <nombre>Pasodoble</nombre> <precio cuota="anual" moneda="euro">320</precio> <plazas>8</plazas> <comienzo>1/1/2011</comienzo> <fin>31/12/2011</fin> <profesor>Miriam Gutierrez</profesor> <sala>1</sala> </baile> </bailes>
- Mostrar cada uno de los nombres de los bailes con la etiqueta "losbailes".
for $baile in /bailes/baile return <losbailes>{$baile/nombre/text()}</losbailes>
- Mostrar los nombres de los bailes seguidos con el número de plazas entre paréntesis, ambos dentro de la misma etiqueta "losbailes".
for $baile in /bailes/baile return <losbailes>{$baile/nombre/text()} ({$baile/plazas/text()})</losbailes>
- Mostrar los nombres de los bailes cuyo precio sea mayor de 30.
for $baile in /bailes/baile where $baile/precio > 30 return $baile/nombre
for $baile in /bailes/baile[precio > 30] return $baile/nombre
- Mostrar los nombres de los bailes cuyo precio sea mayor de 30 y la moneda "euro".
for $baile in /bailes/baile where $baile/precio > 30 and $baile/precio/@moneda = "euro" return $baile/nombre
for $baile in /bailes/baile[precio > 30 and precio/@moneda = "euro"] return $baile/nombre
- Mostrar los nombres y la fecha de comienzo de los bailes que comiencen el mes de enero (utiliza para buscarlo la cadena de texto "/1/").
for $baile in /bailes/baile where contains($baile/comienzo, "/1/") return <baile> {$baile/profesor} {$baile/comienzo} </baile>
- Mostrar los nombres de los profesores y la sala en la que dan clase, ordénalos por sala.
for $baile in /bailes/baile order by $baile/sala return <baile> {$baile/profesor} {$baile/sala} </baile>
- Mostrar los nombres de los profesores eliminando los repetidos y acampañar cada nombre con todas las salas en la que da clase, ordénalos por nombre.
for $profesor in distinct-values(/bailes/baile/profesor) let $salas := /bailes/baile[profesor=$profesor]/sala order by $profesor return <profesores> <nombre>{$profesor}</nombre> {$salas} </profesores>
- Mostrar la media de los precios de todos los bailes.
let $baile := /bailes/baile return <media>{avg($baile/precio)}</media>
- Mostrar la suma de los precios de los bailes de la sala 1.
let $baile := /bailes/baile[sala=1] return <total_sala_1>{sum($baile/precio)}</total_sala_1>
- Mostrar cuántas plazas en total oferta el profesor "Jesus Lozano".
let $baile := /bailes/baile[profesor = "Jesus Lozano"] return <plazas>{sum($baile/plazas)}</plazas>
- Mostrar el dinero que ganaría la profesora "Laura Mendiola" si se completaran todas las plazas de su baile, sabiendo que sólo tiene un baile.
let $baile := /bailes/baile[profesor = "Laura Mendiola"] return $baile/plazas * $baile/precio
- Mostrar el dinero que ganaría el profesor "Jesus Lozano" si se completaran todas las plazas de su baile, pero mostrando el beneficio de cada baile por separado.
for $baile in /bailes/baile where $baile/profesor = "Jesus Lozano" return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
- Mostrar el dinero que ganaría la profesora "Laura" (no conocemos su apellido) si se completaran todas las plazas de su baile.
for $baile in /bailes/baile where starts-with($baile/profesor, "Laura") return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
for $baile in /bailes/baile[starts-with(profesor, "Laura")] return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
- Mostrar el nombre del baile, su precio y el precio con un descuento del 15% para familias numerosas. Ordenar por el nombre del baile
for $baile in /bailes/baile order by $baile/nombre return <baile> {$baile/nombre} <precio>{$baile/precio/text()}</precio> <fam_numerosa>{$baile/precio * 0.85}</fam_numerosa> </baile>
- Mostrar todos los datos de cada baile excepto la fecha de comienzo y de fin.
for $baile in /bailes/baile return <baile>{$baile/* except $baile/comienzo except $baile/fin}</baile>
- Mostrar en una tabla de HTML los nombres de los bailes y su profesor, cada uno en una fila.
<table> { for $baile in /bailes/baile return <tr><td>{$baile/nombre/text()}</td><td>{$baile/profesor/text()}</td></tr> } </table>
Ejercicios prácticos de XQuery escrito por Rafa Morales está protegido por una licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional