Saltar al contenido principal

Ejercicio 602

Consideremos el siguiente documento 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>

Escribe las consultas XQuery que permitan obtener la siguiente información:

  1. Cada uno de los nombres de los bailes con la etiqueta <losbailes>.
  2. Los nombres de los bailes seguidos con el número de plazas entre paréntesis, ambos dentro de la misma etiqueta <losbailes>.
  3. Los nombres de los bailes cuyo precio sea mayor de 30.
  4. Los nombres de los bailes cuyo precio sea mayor de 30 y la moneda euro.
  5. Los nombres y la fecha de comienzo de los bailes que comiencen el mes de enero (utiliza para buscarlo la cadena de texto /1/).
  6. Los nombres de los profesores y la sala en la que dan clase, ordenados por sala.
  7. Los nombres de los profesores, eliminando los repetidos y acompañando cada nombre con todas las salas en la que da clase. Ordenar por nombre.
  8. La media de los precios de todos los bailes.
  9. La suma de los precios de los bailes de la sala 1.
  10. La cantidad de plazas ofertadas por el profesor Jesus Lozano.
  11. El dinero que ganaría la profesora Laura Mendiola si se completaran todas las plazas de su baile, sabiendo que solo tiene un baile.
  12. El dinero que ganaría el profesor Jesus Lozano si se completaran todas las plazas de su baile, pero mostrando el beneficio de cada baile por separado.
  13. Mostrar el dinero que ganaría la profesora Laura (no conocemos su apellido) si se completaran todas las plazas de su baile.
  14. El nombre del baile, su precio y el precio con un descuento del 15% para familias numerosas. Ordenar por el nombre del baile.
  15. Todos los datos de cada baile excepto la fecha de comienzo y de fin.
  16. En una tabla de HTML, los nombres de los bailes y su profesor, cada uno en una fila.
Solución
  1. Cada uno de los nombres de los bailes con la etiqueta <losbailes>.
for $baile in /bailes/baile
return <losbailes>{$baile/nombre/text()}</losbailes>
for $baile in /bailes/baile/nombre
return <losbailes>{$baile/text()}</losbailes>
  1. Los nombres de los bailes seguidos con el número de plazas entre paréntesis, ambos dentro de la misma etiqueta <losbailes>.
for $baile in /bailes/baile
return <losbailes>{$baile/nombre/text()} ({$baile/plazas/text()})</losbailes>
  1. Los nombres de los bailes cuyo precio sea mayor de 30.
for $baile in /bailes/baile
where $baile/precio > 30
return $baile/nombre/text()
  1. Los nombres de los bailes cuyo precio sea mayor de 30 y la moneda euro.
for $baile in /bailes/baile
where $baile/precio > 30 and $baile/precio/@moneda = "euro"
return $baile/nombre/text()
  1. Los nombres y la fecha de comienzo de los bailes que comiencen el mes de enero (utiliza para buscarlo la cadena de texto /1/).
for $baile in /bailes/baile
where contains($baile/comienzo, "/1/")
return
<baile>
{$baile/profesor}
{$baile/comienzo}
</baile>
for $baile in /bailes/baile
where contains($baile/comienzo, "/1/")
return concat($baile/profesor/text(), ' ', $baile/comienzo/text())
  1. Los nombres de los profesores y la sala en la que dan clase, ordenados por sala.
for $baile in /bailes/baile
order by $baile/sala
return
<baile>
{$baile/profesor}
{$baile/sala}
</baile>
  1. Los nombres de los profesores, eliminando los repetidos y acompañando cada nombre con todas las salas en la que da clase. Ordenar por nombre.
for $profesor in distinct-values(/bailes/baile/profesor)
let $salas := /bailes/baile[profesor=$profesor]/sala
order by $profesor
return
<profesores>
<nombre>{$profesor}</nombre>
{$salas}
</profesores>
  1. La media de los precios de todos los bailes.
let $baile := /bailes/baile
return <media>{avg($baile/precio)}</media>
let $baile := /bailes/baile
return avg($baile/precio)
let $precios := /bailes/baile/precio
return avg($precios)
avg(
for $precio in /bailes/baile/precio
return $precio
)
  1. La suma de los precios de los bailes de la sala 1.
sum(
for $baile in /bailes/baile
where $baile/sala="1"
return $baile/precio
)
  1. La cantidad de plazas ofertadas por el profesor Jesus Lozano.
<plazas>
{
sum(
for $baile in /bailes/baile
where $baile/profesor="Jesus Lozano"
return $baile/plazas
)
}
</plazas>
  1. El dinero que ganaría la profesora Laura Mendiola si se completaran todas las plazas de su baile, sabiendo que solo tiene un baile.
for $baile in /bailes/baile
where $baile/profesor="Laura Mendiola"
return $baile/plazas * $baile/precio
  1. El dinero que ganaría el profesor Jesus Lozano si se completaran todas las plazas de su baile, pero mostrando el beneficio de cada baile por separado.
for $baile in /bailes/baile
where $baile/profesor = "Jesus Lozano"
return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
  1. 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 /bailes/baile
where starts-with($baile/profesor, "Laura")
return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
  1. 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 /bailes/baile
order by $baile/nombre
return
<baile>
{$baile/nombre}
<precio>{$baile/precio/text()}</precio>
<fam_numerosa>{$baile/precio * 0.85}</fam_numerosa>
</baile>
  1. Todos los datos de cada baile excepto la fecha de comienzo y de fin.
for $baile in /bailes/baile
return
<baile>
{
$baile/*
except $baile/comienzo
except $baile/fin
}
</baile>
  1. En una tabla de HTML, los nombres de los bailes y su profesor, cada uno en una fila.
<table> 
{
for $baile in /bailes/baile
return
<tr>
<td>{$baile/nombre/text()}</td>
<td>{$baile/profesor/text()}</td>
</tr>
}
</table>