Está en la página 1de 5

Boletín Ejercicios

XQuery Nº1

Dado el siguiente documento XML realiza las siguientes consultas con XQuery (se eliminan
las tildes para evitar problemas de compatibilidad de caracteres):

1. Mostrar los títulos de los libros con la etiqueta "titulo".

for $libro in //title/text()


return <titulo>{$libro}</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 $libro in //book


where $libro/price <= 30
return $libro

for $libro in //book[price<=30]


return <libro>{$libro}</libro>

3. Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30.

for $libro in //book


where $libro/price <= 30
return $libro/title

4. Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o igual a 30.

for $libro in //book


where $libro/price <= 30
return $libro/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 $libro in //book[year=2005]


return <lib2005>{$libro/title,$libro/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 $anyo in //year


return <publicacion>{$anyo/text()}</publicacion>

let $anyo := //year


return <publicacion>{$anyo/text()}</publicacion>

7. Mostrar los libros ordenados primero por "category" y luego por "title" en una sola
consulta.

for $libro in //book


order by $libro/@category,$libro/title
return $libro

8. Mostrar cuántos libros hay, y etiquetarlo con "total".

let $libros := count(//book)


return <total>{$libros}</total>

9. Mostrar los títulos de los libros y al final una etiqueta con el número total de libros.

for $titulo in //book/title


return <titulos>{$titulo/text()}</titulos>, <num>{count(//book)}</num>

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

let $maximo := max(//book/price)


let $minimo := min(//book/price)
return <res>{$maximo,$minimo}</res>

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.

for $libro in //book


order by $libro/price*1.21
return
<book>{$libro/title,$libro/price,<precioIVA>{$libro/price*1.21}</precioIVA>}</book>
12. Mostrar la suma total de los precios de los libros con la etiqueta "total".

let $total := sum(//book/price)


return <total>{$total}</total>

13. Mostrar cada uno de los precios de los libros, y al final una nueva etiqueta con la
suma de los precios.

for $precio in //book/price


return <precio>{$precio/text()}</precio>, <total>{sum(//book/price)}</total>

14. Mostrar el título y el número de autores que tiene cada título en etiquetas
diferentes.

for $libro in //book


return <libro>{$libro/title,<nAutores>{count($libro/author)}</nAutores>}</libro>

15. 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 //book
return <libro>{$libro/title/text()||"("||count($libro/author)||")"}</libro>

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

for $libro in //book[substring(year,string-length(year))="3"]


return $libro

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

for $libro in //book


where starts-with($libro/@category,"C")
return $libro

18. Mostrar los libros que tengan una "X" mayúscula o minúscula en el título.

for $libro in //book


where contains($libro/title,"X") or contains($libro/title,"x")
return $libro

19. Mostrar el título y el número de caracteres que tiene cada título, cada uno con su
propia etiqueta.

for $titulo in //book/title


return <title>{$titulo/text() || " " || string-length($titulo)}</title>

20. Mostrar todos los años en los que se ha publicado un libro eliminando los repetidos.
Etiquétalos con "año".
let $anyo := //book/year
return <año>{distinct-values($anyo)}</año>

21. Mostrar todos los autores eliminando los que se repiten y ordenados por el número
de caracteres que tiene cada autor.

let $autor := //book/author


for $autor in $autor
order by $autor
return <año>{distinct-values($autor)}</año>

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


<table>

<thead>

Libros

</thead>

<tr>

<th>Título</th>

<th>Autor</th>

<th>Año</th>

<th>Precio</th>

</tr>

<tbody>

for $libro in //book

return

<tr>

<td>{$libro/title/text()}</td>

<td>{$libro/author/text()}</td>

<td>{$libro/year/text()}</td>

<td>{$libro/price/text()}</td>

</tr>

</tbody>

</table>
2 EJERCICIO
Extraer la ciudad de los proveedores (no debe aparecer la etiqueta) que tengan un
estado mayor de 15
for $ciudad in //proveedor[estado>15]/ciudad
return $ciudad/text()

Averiguar cuántas partes existen, es decir, el total de filas de la «tabla» partes.

let $numpartes := count(//parte)

return $numpartes

Obtener el nombre de los proyectos cuya ciudad sea Paris y que reciban una cantidad de
partes > 350.

let $proyectos := //proyecto[ciudad="Paris"]/@numproyecto


let $suministrapartes := //suministra[numproyecto=$proyectos and
cantidad>350]/numproyecto

return //proyecto[@numproyecto=$suministrapartes]/nombreproyecto

Obtener los nombres de proyecto y nombres de parte que estén en la misma ciudad.

Obtener parejas de partes que tengan el mismo color (indicando el nombre de ambas
partes y el color que comparten).

Crear una consulta XQuery que averigüe la media de partes suministradas cuyo color sea
“Rojo”.

let $media := avg(//suministra[numparte=//parte[color="Rojo"]/@numparte]/cantidad)


return $media

Averiguar la media de cantidades por proveedor usando los datos de la tabla suministra.

Averiguar el nombre de los proyectos (sin que haya repeticiones) que reciban una
cantidad en la tabla suministra mayor de 650.

//proyecto[@numproyecto=distinct-values(//suministra[cantidad>650]/numproyecto)]/nom
breproyecto

También podría gustarte