Saltar al contenido principal

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:

  1. Cada uno de los nombres de las categorías con la etiqueta <categoria>.
  2. Los títulos de los tutoriales con el número de visitas entre paréntesis, ambos dentro de la misma etiqueta <lostutoriales>.
  3. Los nombres de los tutoriales con menos de 2000 visitas.
  4. Los nombres de los tutoriales de XML con más de 30.000 visitas.
  5. El número total de visitas.
  6. Los nombres de las categorías distintas, cada una en una etiqueta <categoriadistintas>.
  7. 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>.
  8. La media de vistas de los tutoriales, dentro de una etiqueta <media>.
  9. Número total de tutoriales de XML etiquetados dentro de una etiqueta <totaltutoriales>.
  10. El nombre del tutorial y su categoría, ordenado por el nombre de cada categoría.
  11. Todos los datos de cada tutorial excepto las visitas.
  12. En una tabla de HTML de dos columnas, el título de los tutoriales y los nombres de los autores.
Solución
  1. Cada uno de los nombres de las categorias con la etiqueta <categoria>.
for $tutorial in /tutoriales/tutorial
return $tutorial/categoria/text()
  1. 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>
  1. Los nombres de los tutoriales con menos de 2000 visitas.
for $tutorial in /tutoriales/tutorial
where $tutorial/visitas < 2000
return $tutorial/titulo/text()
  1. 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()
  1. El número total de visitas.
sum(
for $tutorial in /tutoriales/tutorial
return $tutorial/visitas
)
  1. 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>
  1. 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>
  1. La media de vistas de los tutoriales, dentro de una etiqueta <media>
<media>
{
avg(for $visitas in /tutoriales/tutorial/visitas
return $visitas)
}
</media>
  1. 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>
  1. 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>
  1. 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>
  1. 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>