Está en la página 1de 13

Ejercicios XQuery

a. Dado el siguiente 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>

a. Mostrar los títulos de los libros


for $titulo in doc(libros.xml)/bookstore/book/title/text()
return <titulo>{$titulo}</titulo>
b. Mostrar los libros cuyo precio sea menor o igual a 30.
i. Incluyendo la condición en la cláusula where
for $libro in doc(libros.xml)/bookstore/book
where $libro/price <= 30
return $libro
ii. Incluyendo la condición en la ruta del XPath
for $libro in doc(libros.xml)/bookstore/book[price<=30]
return $libro
c. Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30
for $libro in doc(libros.xml)/bookstore/book
where $libro/price <= 30
return $libro/title
d. Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o igual a 30.
for $libro in doc(libros.xml)/bookstore/book[price<=30]
return <title>{$libro/title/text()}</title>
e. Mostrar el título y el autor de los libros del año 2005.
for $libro in doc(libros.xml)/bookstore/book
where $libro/year=2005
return <lib2005>{$libro/title,$libro/author}</lib2005>
f. Mostrar los años de publicación, primero con "for" y luego con "let" para comprobar la
diferencia entre ellos.
for $year in doc(libros.xml)/bookstore/book/year
return <publicacion>{$year}</publicacion>

let $year := doc(libros.xml)/bookstore/book/year


return <publicacion>{$year}</publicacion>
g. Mostrar los libros ordenados primero por "category" y luego por "title" en una sola
consulta.
for $libro in doc(libros.xml)/bookstore/book
order by $libro/@category,$libro/title
return $libro

h. (Desde aquí funciones)


i. Mostrar cuántos libros hay, y etiquetarlo con "total".
let $num_libro := count(doc(libros.xml)/bookstore/book)
return <total>{$num_libro}</total>

<total>4</total>

j. Mostrar los títulos de los libros y al final una etiqueta con el número total de libros.
let $total := count (doc(libros.xml)/bookstore/book),
$titulos := (
for $libro in doc(libros.xml)/bookstore/book/title
return <titulo>{$libro/text()}</titulo>)
return
<resultado>
{$titulos}
<total_libros>{$total}</total_libros>
</resultado>

<resultado>
<titulo>Everyday Italian</titulo>
<titulo>Harry Potter</titulo>
<titulo>XQuery Kick Start</titulo>
<titulo>Learning XML</titulo>
<total_libros>4</total_libros>
</resultado>

k. Mostrar el precio mínimo y máximo de los libros.


let $max := max(doc(libros.xml)/bookstore/book/price),
$min := min(doc(libros.xml)/bookstore/book/price)
return
<resultado>
<max>{$max}</max>
<min>{$min}</min>
</resultado>

<resultado>
<max>49.99</max>
<min>29.99</min>
</resultado>

l. 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 doc(libros.xml)/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>

<libro>
<titulo>Harry Potter</titulo>
<precio>29.99</precio>
<precio_IVA>36.2879</precio_IVA>
</libro>
<libro>
<titulo>Everyday Italian</titulo>
<precio>30.00</precio>
<precio_IVA>36.3</precio_IVA>
</libro>
<libro>
<titulo>Learning XML</titulo>
<precio>39.95</precio>
<precio_IVA>48.3395</precio_IVA>
</libro>
<libro>
<titulo>XQuery Kick Start</titulo>
<precio>49.99</precio>
<precio_IVA>60.4879</precio_IVA>
</libro>

m. Mostrar la suma total de los precios de los libros con la etiqueta "total".
let $libros := doc(libros.xml)/bookstore/book
return <total>{sum($libros/price)}</total>
<total>149.93</total>

n. 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 doc(libros.xml)/bookstore/book
return $libro/price
}
{
let $libros := doc(libros.xml)/bookstore/book
return <total>{sum($libros/price)}</total>
}
</libros>

<libros>
<price>30.00</price>
<price>29.99</price>
<price>49.99</price>
<price>39.95</price>
<total>149.93</total>
</libros>

o. Mostrar el título y el número de autores que tiene cada título en etiquetas diferentes.
for $libro in doc(libros.xml)/bookstore/book
return
<libro>
{$libro/title}
<autores>{count($libro/author)}</autores>
</libro>

<libro>
<titulo>Everyday Italian</titulo>
<num_autores>1</num_autores>
</libro>
<libro>
<titulo>Harry Potter</titulo>
<num_autores>1</num_autores>
</libro>
<libro>
<titulo>XQuery Kick Start</titulo>
<num_autores>5</num_autores>
</libro>
<libro>
<titulo>Learning XML</titulo>
<num_autores>1</num_autores>
</libro>
p. 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 doc(libros.xml)/bookstore/book
return <libro>{$libro/title/text()} ({count($libro/author)})</libro>

<libro>
<titulo>Everyday Italian (1)</titulo>
</libro>
<libro>
<titulo>Harry Potter (1)</titulo>
</libro>
<libro>
<titulo>XQuery Kick Start (5)</titulo>
</libro>
<libro>
<titulo>Learning XML (1)</titulo>
</libro>

q. Mostrar los libros escritos en años que terminen en "3".

for $libro in doc(libros.xml)/bookstore/book


where ends-with($libro/year, "3")
return $libro

<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>

r. Mostrar los libros cuya categoría empiece por "C".


for $libro in doc(libros.xml)/bookstore/book
where starts-with($libro/@category, "C")
return $libro

for $libro in doc(libros.xml)/bookstore/book[starts-with(@category, "C")]


return $libro
<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>

s. Mostrar los libros que tengan una "X" mayúscula o minúscula en el título ordenados
de manera descendente.
for $libro in doc(libros.xml)/bookstore/book
where contains($libro/title, "x") or contains($libro/title, "X")
order by $libro/title descending
return $libro

<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>

t. Mostrar el título y el número de caracteres que tiene cada título, cada uno con su
propia etiqueta.
for $libro in doc(libros.xml)/bookstore/book
return
<libro>
{$libro/title}
<length>{string-length($libro/title)}</length>
</libro>

<libro>
<titulo>Everyday Italian</titulo>
<num_caracteres>16</num_caracteres>
</libro>
<libro>
<titulo>Harry Potter</titulo>
<num_caracteres>12</num_caracteres>
</libro>
<libro>
<titulo>XQuery Kick Start</titulo>
<num_caracteres>17</num_caracteres>
</libro>
<libro>
<titulo>Learning XML</titulo>
<num_caracteres>12</num_caracteres>
</libro>

u. 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(doc(libros.xml)/bookstore/book/year)
return <año>{$año}</año>

<año>2005</año>
<año>2003</año>

v. 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(doc(libros.xml)/bookstore/book/author)
order by string-length($autor)
return <autor>{$autor}</autor>

<autor>Kurt Cagle</autor>
<autor>James Linn</autor>
<autor>Per Bothner</autor>
<autor>Erik T. Ray</autor>
<autor>J K. Rowling</autor>
<autor>James McGovern</autor>
<autor>Giada De Laurentiis</autor>
<autor>Vaidyanathan Nagarajan</autor>

w. Mostrar los títulos en una tabla de HTML.


<table>
{
for $libro in doc(libros.xml)/bookstore/book
return
<tr>
<td>{$libro/title/text()}</td>
</tr>
}
</table>
<table>
<tr>
<td>Everyday Italian</td>
</tr>
<tr>
<td>Harry Potter</td>
</tr>
<tr>
<td>XQuery Kick Start</td>
</tr>
<tr>
<td>Learning XML</td>
</tr>
</table>

b. Dado el siguiente XML:


<?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>

a. Mostrar cada uno de los nombres de los bailes


for $baile in doc(bailes.xml)/bailes/baile
return <losbailes>{$baile/nombre/text()}</losbailes>
b. Mostrar los nombres de los bailes seguidos con el número de plazas entre paréntesis.
for $baile in doc(bailes.xml)/bailes/baile
return <losbailes>{$baile/nombre/text()} ({$baile/plazas/text()})</losbailes>
c. Mostrar los nombres de los bailes cuyo precio sea mayor de 30.
for $baile in doc(bailes.xml)/bailes/baile
where $baile/precio > 30
return $baile/nombre

for $baile in doc(bailes.xml)/bailes/baile[precio > 30]


return $baile/nombre
d. Mostrar los nombres de los bailes cuyo precio sea mayor de 30 y la moneda "euro".
for $baile in doc(bailes.xml)/bailes/baile
where $baile/precio > 30 and $baile/precio/@moneda = "euro"
return $baile/nombre
e. Mostrar los nombres de los profesores y la sala en la que dan clase, ordénalos por sala.
for $baile in doc(bailes.xml)/bailes/baile
where contains($baile/comienzo, "/1/")
return
<baile>
{$baile/profesor}
{$baile/comienzo}
</baile>
f. (Desde aquí funciones) Mostrar los nombres de los profesores eliminando los
repetidos y acompañar cada nombre con todas las salas en la que da clase, ordénalos
por nombre.
for $profesor in distinct-values(doc(bailes.xml)/bailes/baile/profesor)
let $salas := doc(bailes.xml)/bailes/baile[profesor=$profesor]/sala
order by $profesor
return
<profesores>
<nombre>{$profesor}</nombre>
{$salas}
</profesores>

<profesor>
<nombre>Jesus Lozano</nombre>
<sala>2</sala>
<sala>2</sala>
</profesor>
<profesor>
<nombre>Laura Mendiola</nombre>
<sala>1</sala>
</profesor>
<profesor>
<nombre>Miriam Gutierrez</nombre>
<sala>1</sala>
<sala>1</sala>
</profesor>
<profesor>
<nombre>Roberto Garcia</nombre>
<sala>1</sala>
</profesor>

g. Mostrar la media de los precios de todos los bailes.


let $baile := doc(bailes.xml)/bailes/baile
return <media>{avg($baile/precio)}</media>

<media>94</media>

h. Mostrar la suma de los precios de los bailes de la sala 1.


let $baile := doc(bailes.xml)/bailes/baile[sala=1]
return <total_sala_1>{sum($baile/precio)}</total_sala_1>

<suma>457</suma>
i. Mostrar todos los datos de cada baile excepto la fecha de comienzo y de fin.
for $baile in doc(bailes.xml)/bailes/baile
return <baile>{$baile/* except $baile/comienzo except $baile/fin}</baile>

<baile>
<nombre>Tango</nombre>
<precio cuota="mensual" moneda="euro">27</precio>
<plazas>20</plazas>
<profesor>Roberto Garcia</profesor>
<sala>1</sala>
</baile>
<baile>
<nombre>Cha-cha-cha</nombre>
<precio cuota="trimestral" moneda="euro">80</precio>
<plazas>18</plazas>
<profesor>Miriam Gutierrez</profesor>
<sala>1</sala>
</baile>
<baile>
<nombre>Rock</nombre>
<precio cuota="mensual" moneda="euro">30</precio>
<plazas>15</plazas>
<profesor>Laura Mendiola</profesor>
<sala>1</sala>
</baile>
<baile>
<nombre>Merengue</nombre>
<precio cuota="trimestral" moneda="dolares">75</precio>
<plazas>12</plazas>
<profesor>Jesus Lozano</profesor>
<sala>2</sala>
</baile>
<baile>
<nombre>Salsa</nombre>
<precio cuota="mensual" moneda="euro">32</precio>
<plazas>10</plazas>
<profesor>Jesus Lozano</profesor>
<sala>2</sala>
</baile>
<baile>
<nombre>Pasodoble</nombre>
<precio cuota="anual" moneda="euro">320</precio>
<plazas>8</plazas>
<profesor>Miriam Gutierrez</profesor>
<sala>1</sala>
</baile>
j. 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 doc(bailes.xml)/bailes/baile
order by $baile/nombre
return
<baile>
{$baile/nombre}
<precio>{$baile/precio/text()}</precio>
<fam_numerosa>{$baile/precio * 0.85}</fam_numerosa>
</baile>

<baile>
<nombre>Cha-cha-cha</nombre>
<precio>80</precio>
<precio_familia_numerosa>68</precio_familia_numerosa>
</baile>
<baile>
<nombre>Merengue</nombre>
<precio>75</precio>
<precio_familia_numerosa>63.75</precio_familia_numerosa>
</baile>
<baile>
<nombre>Pasodoble</nombre>
<precio>320</precio>
<precio_familia_numerosa>272</precio_familia_numerosa>
</baile>
<baile>
<nombre>Rock</nombre>
<precio>30</precio>
<precio_familia_numerosa>25.5</precio_familia_numerosa>
</baile>
<baile>
<nombre>Salsa</nombre>
<precio>32</precio>
<precio_familia_numerosa>27.2</precio_familia_numerosa>
</baile>
<baile>
<nombre>Tango</nombre>
<precio>27</precio>
<precio_familia_numerosa>22.95</precio_familia_numerosa>
</baile>

k. 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 doc(bailes.xml)/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>

<beneficio>450</beneficio>

También podría gustarte