Ejercicio 603
Consideremos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<libreria>
<libro categoria="COCINA">
<titulo idioma="es">Everyday Italian</titulo>
<autor>Giada De Laurentiis</autor>
<año>2005</año>
<precio>30.00</precio>
</libro>
<libro categoria="NIÑOS">
<titulo idioma="es">Harry Potter</titulo>
<autor>J K. Rowling</autor>
<año>2005</año>
<precio>29.99</precio>
</libro>
<libro categoria="WEB">
<titulo idioma="es">XQuery Kick Start</titulo>
<autor>James McGovern</autor>
<autor>Per Bothner</autor>
<autor>Kurt Cagle</autor>
<autor>James Linn</autor>
<autor>Vaidyanathan Nagarajan</autor>
<año>2003</año>
<precio>49.99</precio>
</libro>
<libro categoria="WEB">
<titulo idioma="es">Learning XML</titulo>
<autor>Erik T. Ray</autor>
<año>2003</año>
<precio>39.95</precio>
</libro>
</libreria>
Escribe las consultas XQuery que permitan obtener la siguiente información:
- Los títulos de los libros con la etiqueta
<titulo>
. - Los libros cuyo precio sea menor o igual a 30.
- Solo el título de los libros cuyo precio sea menor o igual a 30.
- Solo el título sin atributos de los libros cuyo precio sea menor o igual a 30.
- El título y el autor de los libros del año 2005, y etiquetar cada uno de ellos con la etiqueta
<lib2005>
. - Los años de publicación, primero con
for
y luego conlet
para comprobar la diferencia entre ellos. Etiquetar la salida con<publicacion>
. - Los libros ordenados primero por el atributo
categoria
y luego portitulo
en una sola consulta. - La cantidad de libros. Se debe etiquetar con
<total>
. - Los títulos de los libros y, al final, una etiqueta con el número total de libros.
- El precio mínimo y máximo de los libros.
- El título del libro, su precio y su precio con el IVA incluido, cada uno con su propia etiqueta. Ordenarlos por precio con IVA.
- La suma total de los precios de los libros. Se debe etiquetar con
<total>
. - Cada uno de los precios de los libros y, al final, una nueva etiqueta con la suma de los precios.
- El título y el número de autores que tiene cada título en etiquetas diferentes.
- En la misma etiqueta, el título y, entre paréntesis, el número de autores que tiene ese título.
- Los libros escritos en años que terminen en "3".
- Los libros cuya categoría empiece por "C".
- Los libros que tengan una "X" mayúscula o minúscula en el título ordenados de manera descendente.
- El título y el número de caracteres que tiene cada título, cada uno con su propia etiqueta.
- Todos los años en los que se ha publicado un libro eliminando los repetidos. Se deben etiquetar con
<año>
. - Todos los autores eliminando los que se repiten y ordenados por el número de caracteres que tiene cada autor.
- Los títulos en una tabla de HTML.
Solución
- Los títulos de los libros con la etiqueta
<titulo>
.
for $titulo in /libreria/libro/titulo/text()
return <titulo>{$titulo}</titulo>
- Los libros cuyo precio sea menor o igual a 30.
for $libro in /libreria/libro
where $libro/precio <= 30
return $libro
- Solo el título de los libros cuyo precio sea menor o igual a 30.
for $libro in /libreria/libro
where $libro/precio <= 30
return $libro/titulo
- Solo el título sin atributos de los libros cuyo precio sea menor o igual a 30.
for $libro in /libreria/libro
where $libro/precio <= 30
return data($libro/titulo)
- El título y el autor de los libros del año 2005, y etiquetar cada uno de ellos con la etiqueta
<lib2005>
.
for $libro in /libreria/libro
where $libro/año=2005
return <lib2005>{$libro/titulo,$libro/autor}</lib2005>
- Los años de publicación, primero con
for
y luego conlet
para comprobar la diferencia entre ellos. Etiquetar la salida con<publicacion>
.
for $libro in /libreria/libro
return <publicacion>{data($libro/año)}</publicacion>
- Los libros ordenados primero por el atributo
categoria
y luego portitulo
en una sola consulta.
for $libro in /libreria/libro
order by $libro/@categoria,$libro/titulo
return $libro
- La cantidad de libros. Se debe etiquetar con
<total>
.
<total>{ count(for $libro in /libreria/libro return $libro) }</total>
- Los títulos de los libros y, al final, una etiqueta con el número total de libros.
let $total := count (/libreria/libro),
$titulos := (
for $libro in /libreria/libro/titulo
return <titulo>{$libro/text()}</titulo>
)
return
<resultado>
{$titulos}
<total_libros>{$total}</total_libros>
</resultado>
- El precio mínimo y máximo de los libros.
let $max := max(/libreria/libro/precio),
$min := min(/libreria/libro/precio)
return
<resultado>
<max>{$max}</max>
<min>{$min}</min>
</resultado>
- El título del libro, su precio y su precio con el IVA incluido, cada uno con su propia etiqueta. Ordenarlos por precio con IVA.
for $libro in /libreria/libro
let $precio_iva := ($libro/precio * 1.21)
order by $precio_iva
return
<libro>
<titulo>{$libro/titulo/text()}</titulo>
<precio>{$libro/precio/text()} €</precio>
<precio_iva>{$precio_iva} €</precio_iva>
</libro>
- La suma total de los precios de los libros. Se debe etiquetar con
<total>
.
let $libros := /libreria/libro
return <total>{sum($libros/precio)}</total>
- Cada uno de los precios de los libros y, al final, una nueva etiqueta con la suma de los precios.
let $libros := /libreria/libro
return <precios>
{$libros/precio}
<total>{sum($libros/precio)}</total>
</precios>
- El título y el número de autores que tiene cada título en etiquetas diferentes.
for $libro in /libreria/libro
return
<libro>
{$libro/titulo}
<autores>{count($libro/autor)}</autores>
</libro>
- En la misma etiqueta, el título y, entre paréntesis, el número de autores que tiene ese título.
for $libro in /libreria/libro
return <libro>{$libro/titulo/text()} ({count($libro/autor)})</libro>
- Los libros escritos en años que terminen en "3".
for $libro in /libreria/libro
where ends-with($libro/año, "3")
return $libro
- Los libros cuya categoría empiece por "C".
for $libro in /libreria/libro
where starts-with($libro/@categoria, "C")
return $libro
- Los libros que tengan una "X" mayúscula o minúscula en el título ordenados de manera descendente.
for $libro in /libreria/libro
where contains($libro/titulo, "x") or contains($libro/titulo, "X")
order by $libro/titulo descending
return $libro
- El título y el número de caracteres que tiene cada título, cada uno con su propia etiqueta.
for $libro in /libreria/libro
return <libro>
{$libro/titulo}
<caracteres>{string-length($libro/titulo)}</caracteres>
</libro>
- Todos los años en los que se ha publicado un libro eliminando los repetidos. Se deben etiquetar con
<año>
.
for $año in distinct-values(/libreria/libro/año)
return <año>{$año}</año>
- 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(/libreria/libro/autor)
order by string-length($autor)
return <autor>{$autor}</autor>
- Los títulos en una tabla de HTML.
<table>
{
for $libro in /libreria/libro
return
<tr>
<td>{$libro/titulo/text()}</td>
</tr>
}
</table>