Ejercicio 605
Consideremos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<tutoriales>
<tutorial anio="2007">
<titulo>XMLBeans, una forma de mapear un XML en objetos Java</titulo>
<autor>
<nombre>Alejandro</nombre>
<apellidos>Pérez García</apellidos>
</autor>
<categoria>XML</categoria>
<visitas>25827</visitas>
</tutorial>
<tutorial anio="2013">
<titulo>Spring Security: haciendo uso de un servidor LDAP embebido</titulo>
<autor>
<nombre>José Manuel</nombre>
<apellidos>Sánchez Suárez</apellidos>
</autor>
<categoria>Spring</categoria>
<visitas>1996</visitas>
</tutorial>
<tutorial anio="2011">
<titulo>Mybatis con Maven y Spring</titulo>
<autor>
<nombre>Rubén</nombre>
<apellidos>Aguilera Díaz-Heredero</apellidos>
</autor>
<categoria>Mybatis</categoria>
<visitas>6998</visitas>
</tutorial>
<tutorial anio="2011">
<titulo>Trabajar con XML sabiendo lo mínimo</titulo>
<autor>
<nombre>Roberto</nombre>
<apellidos>Canales Mora</apellidos>
</autor>
<categoria>XML</categoria>
<visitas>34842</visitas>
</tutorial>
<tutorial anio="2013">
<titulo>Introducción a Spring Batch</titulo>
<autor>
<nombre>Miguel</nombre>
<apellidos>Arlandy Rodríguez</apellidos>
</autor>
<categoria>Spring</categoria>
<visitas>1273</visitas>
</tutorial>
</tutoriales>
Escribe las consultas XQuery que permitan obtener la siguiente información:
- Cada uno de los nombres de las categorías con la etiqueta
<categoria>
. - Los títulos de los tutoriales con el número de visitas entre paréntesis, ambos dentro de la misma etiqueta
<lostutoriales>
. - Los nombres de los tutoriales con menos de 2000 visitas.
- Los nombres de los tutoriales de XML con más de 30.000 visitas.
- El número total de visitas.
- Los nombres de las categorías distintas, cada una en una etiqueta
<categoriadistintas>
. - Nombres y apellidos de los autores eliminando los repetidos y acompañados cada nombre por todos sus tutoriales, ordenados alfabéticamente por nombre de autor. Cada autor en una etiqueta
<autor>
que contendrá una etiqueta<nombreyapellidos>
y una etiqueta<titulo>
. - La media de vistas de los tutoriales, dentro de una etiqueta
<media>
. - Número total de tutoriales de XML etiquetados dentro de una etiqueta
<totaltutoriales>
. - El nombre del tutorial y su categoría, ordenado por el nombre de cada categoría.
- Todos los datos de cada tutorial excepto las visitas.
- En una tabla de HTML de dos columnas, el título de los tutoriales y los nombres de los autores.
Solución
- Cada uno de los nombres de las categorias con la etiqueta
<categoria>
.
for $tutorial in /tutoriales/tutorial
return $tutorial/categoria/text()
- Los títulos de los tutoriales con el número de visitas entre paréntesis, ambos dentro de la misma etiqueta
<lostutoriales>
.
for $tutorial in /tutoriales/tutorial
return
<lostutoriales>
{$tutorial/titulo/text()} ({$tutorial/visitas/text()})
</lostutoriales>
- Los nombres de los tutoriales con menos de 2000 visitas.
for $tutorial in /tutoriales/tutorial
where $tutorial/visitas < 2000
return $tutorial/titulo/text()
- Los nombres de los tutoriales de XML con más de 30.000 visitas.
for $tutorial in /tutoriales/tutorial
where contains($tutorial/titulo, 'XML') and $tutorial/visitas > 30000
return $tutorial/titulo/text()
for $tutorial in //tutorial
where where $tutorial/categoria = "XML" and $tutorial/visitas > 30000
return $tutorial/titulo/text()
- El número total de visitas.
sum(
for $tutorial in /tutoriales/tutorial
return $tutorial/visitas
)
- Los nombres de las categorías distintas, cada una en una etiqueta
<categoriasdistintas>
for $categoria in distinct-values(/tutoriales/tutorial/categoria)
return <categoriasdistintas>{$categoria}</categoriasdistintas>
- Nombres y apellidos de los autores eliminando los repetidos y acompañados cada nombre por todos sus tutoriales, ordenados alfabéticamente por nombre de autor. Cada autor en una etiqueta
<autor>
que contendrá una etiqueta<nombreyapellidos>
y una etiqueta<titulo>
.
for $autor in distinct-values(/tutoriales/tutorial/autor)
for $tutoriales in /tutoriales/tutorial
order by $autor ascending
where $tutoriales/autor = $autor
return
<autor>
<nombreyapellidos>{$autor}</nombreyapellidos>
<titulo>{$tutoriales/titulo}</titulo>
</autor>
- La media de vistas de los tutoriales, dentro de una etiqueta
<media>
<media>
{
avg(for $visitas in /tutoriales/tutorial/visitas
return $visitas)
}
</media>
- Número total de tutoriales de XML etiquetados dentro de una etiqueta
<totaltutoriales>
<totaltutoriales>
{
count(
for $tutorial in /tutoriales/tutorial
where $tutorial/categoria = "XML"
return $tutorial
)
}
</totaltutoriales>
- El nombre del tutorial y su categoría, ordenado por el nombre de cada categoría.
for $tutorial in /tutoriales/tutorial
order by $tutorial/categoria ascending
return
<tutorial>
{$tutorial/categoria}
{$tutorial/titulo}
</tutorial>
- Todos los datos de cada tutorial excepto las visitas.
for $tutorial in /tutoriales/tutorial
return
<tutorial>
{$tutorial/titulo}
<autor>
{$tutorial/autor/nombre}
{$tutorial/autor/apellidos}
</autor>
{$tutorial/categoria}
</tutorial>
- En una tabla de HTML de dos columnas, el título de los tutoriales y los nombres de los autores.
<table>
{
for $tutorial in /tutoriales/tutorial
return
<tr>
<td>{$tutorial/titulo/text()}</td>
<td>{$tutorial/autor/nombre/text()}</td>
</tr>
}
</table>