Ejercicio 606
Consideremos el siguiente documento XML.
Escribe las consultas XQuery que permitan obtener la siguiente información:
- Una lista que contiene, para cada receta, el elemento
<titulo>
de la receta y un elemento<calorias>
que contenga el número de calorías. - Una lista similar a la primera, ordenada según las calorías.
- Una lista similar a la primera, ordenada alfabéticamente según el título.
- Una lista similar a la primera, ordenada según el contenido de grasa.
- Una lista similar a la primera, con el título como atributo y las calorías como contenido.
- Una lista que contenga para cada receta, el título como atributo y cada uno de los ingredientes de nivel superior (sin añadir los ingredientes que están dentro de otros ingredientes).
- Una lista con cada una de las recetas que contengan el ingrediente
harina
. Poner el título de la receta como atributo del elementoreceta
. - Una lista de todas aquellas recetas que tengan un ingrediente llamado
relleno
y este contenga en su interior más de 5 elementosingrediente
. La lista resultante estará formada por elementosreceta
que contienen un atributotitulo
con el valor del elementotitulo
de la receta. Además, dentro de cada elementoreceta
habrá elementosingrediente
con el nombre de cada uno de los ingredientes.
Solución
- Una lista que contiene, para cada receta, el elemento
<titulo>
de la receta y un elemento<calorias>
que contenga el número de calorías.
<recetas>
{
for $r in /recetas/receta
return
<receta>
{
$r/titulo,
<calorias>{number($r/nutricion/@caloria)}</calorias>
}
</receta>
}
</recetas>
- Una lista similar a la primera, ordenada según las calorías.
<recetas>
{
for $r in /recetas/receta
order by number($r/nutricion/@caloria)
return
<receta>
{
$r/titulo,
<calorias>{number($r/nutricion/@caloria)}</calorias>
}
</receta>
}
</recetas>
- Una lista similar a la primera, ordenada alfabéticamente según el título.
<recetas>
{
for $r in /recetas/receta
order by string($r/titulo)
return
<receta>
{
$r/titulo,
<calorias>{number($r/nutricion/@caloria)}</calorias>
}
</receta>
}
</recetas>
- Una lista similar a la primera, ordenada según el contenido de grasa.
<recetas>
{
for $r in /recetas/receta
let $grasa := number($r/nutricion/@grasa || $r/nutricion/@grasas)
order by $grasa
return
<receta>
{
$r/titulo,
<calorias>{number($r/nutricion/@caloria)}</calorias>
}
</receta>
}
</recetas>
- Una lista similar a la primera, con el título como atributo y las calorías como contenido.
<recetas>
{
for $r in /recetas/receta
order by string($r/titulo)
return
<receta titulo="{$r/titulo}">
{
<calorias>{number($r/nutricion/@caloria)}</calorias>
}
</receta>
}
</recetas>
- Una lista que contenga para cada receta, el título como atributo y cada uno de los ingredientes de nivel superior (sin añadir los ingredientes que están dentro de otros ingredientes).
<recetas>
{
for $r in /recetas/receta
return
<receta title="{$r/titulo}">
{
for $i in $r/ingrediente
return
<ingrediente>
{string($i/@nombre)}
</ingrediente>
}
</receta>
}
</recetas>
- Una lista con cada una de las recetas que contengan el ingrediente
harina
. Poner el título de la receta como atributo del elementoreceta
.
<recetas>
{
for $r in /recetas/receta
where $r//ingrediente/@nombre="harina"
return <receta title="{$r/titulo}"></receta>
}
</recetas>
- Una lista de todas aquellas recetas que tengan un ingrediente llamado
relleno
y este contenga en su interior más de 5 elementosingrediente
. La lista resultante estará formada por elementosreceta
que contienen un atributotitulo
con el valor del elementotitulo
de la receta. Además, dentro de cada elementoreceta
habrá elementosingrediente
con el nombre de cada uno de los ingredientes.
<recetas>
{
for $r in /recetas/receta
for $i in $r/ingrediente
where $i/@nombre="relleno" and count($i/ingrediente) > 5
return
<receta title="{$r/titulo}">
{
for $f in $i/ingrediente
return <ingrediente>{data($f/@nombre)}</ingrediente>
}
</receta>
}
</recetas>
for $receta in /recetas/receta
where
$receta/ingrediente/@nombre='relleno' and
count($receta/ingrediente[@nombre='relleno']/ingrediente) > 5
return
<receta title="{$receta/titulo}">
{
for $ingrediente in $receta/ingrediente[@nombre='relleno']/ingrediente
return <ingrediente>{data($ingrediente/@nombre)}</ingrediente>
}
</receta>