Programa: BaseX
Meter en en programa BaseX el fichero
XML libros_BD.xml siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Asignatura AGI - EUI (UPM)-->
<libros xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="libros.xsd">
<libro id="1">
<titulo>Fundamentos de Sistemas de Bases de Datos</titulo>
<autor>
<apellidos>ELMASRI,</apellidos>
<nombre>R.A.</nombre>
</autor>
<autor>
<apellidos>Gomez</apellidos>
<nombre>Pepe</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<año>2007</año>
<precio>45.25</precio>
</libro>
<libro id="2">
<titulo>Introducción a los Sistemas de Bases de Datos </titulo>
<autor>
<apellidos>DATE</apellidos>
<nombre>C.J.</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<año>2001</año>
<precio>60.35</precio>
</libro>
<libro id="3">
<titulo>Bases de Datos</titulo>
<autor>
<apellidos>Santos</apellidos>
<nombre>E.</nombre>
</autor>
<autor>
<apellidos>Garcia</apellidos>
<nombre>A.</nombre>
</autor>
<autor>
<apellidos>Alonso</apellidos>
<nombre>S.</nombre>
</autor>
<autor>
<apellidos>Alarcon</apellidos>
<nombre>P.</nombre>
</autor>
<autor>
<apellidos>Garbajosa</apellidos>
<nombre>J.</nombre>
</autor>
<editorial>E.U. Informatica</editorial>
<año>1998</año>
<precio>20.00</precio>
</libro>
<libro id="4">
<titulo>Introducción a las Bases de Datos</titulo>
<autor>
<apellidos>Pons</apellidos>
<nombre>O.</nombre>
</autor>
<editorial>Thomson</editorial>
<año>2005</año>
<precio>100.25</precio>
</libro>
</libros>
XPath
1.- Autores cuyo apellido sea DATE
/libros/libro/autor[apellidos="DATE"]
2.- Libros con mas de un autor
/libros/libro[count(autor)>1]
4.- Todos los autores
/descendant::autor
3.- Libros editados en 1998 y en 2005
/libros/libro[año=1998]|/libros/libro[año=2005]
/libros/libro[año>=1995]|/libros/libro[año <=2005]
/libros/libro[año>=1995]|/libros/libro[año <=2005]
5.- Todos los valores del
atributo id
//@id
6.- Libro que ocupa la tercera posicion
//libros/libro[3]
7.- Penuntimo autor del tercer libro
/libros/libro/autor[last()-1]
/libros/libro[3]/autor[position()=3]
8.- Los dos primeros autores del tercer libro
/libros/libro[3]/autor[position()>=1 and
position() <=2]
9.- Libros que tienen en atributo id mayor que
2.
/libros/libro[@id
>2]
10.- Libros editados entre 1998 y 2005
/libros/libro[año>=1995 and año <2005]
/libros/libro[año>=1995]|/libros/libro[año <=2005]
/libros/libro[año>=1995]|/libros/libro[año <=2005]
XQUERY (Nota: En general, incremento la salida para ver cómo se pueden conseguir más resultados en la misma consulta a la vez que se comprueban
1. Obtener la lista de autores de cada libro
for $var in /libros/libro/autor
return $var/apellidos
2. Obtener los títulos de libro de los que conste más de
un autor.
for $var in libros/libro
let $contador:= count ($var/autor)
where $contador >1
return
<Titulo>{$var/titulo}<numeroAutores>{$contador}</numeroAutores></Titulo>
for $var in /libros/libro
let $contador:= count($var/autor)
where $contador>1
return <Titulo>{$var/titulo/string(), <contador> {$contador} </contador>} </Titulo>
for $b in /libros/libro
let $a := $b/autor
where count($a) > 1
return $b/titulo
Modos de concatenación:
for $var in /libros/libro
let $contador:= count($var/autor)
where $contador>1
return <Titulo>{$var/titulo/string()}, {$var/año}, {$var/autor/nombre/string()}, {$contador} </Titulo>
for $var in libros/libro
let $contador:= count ($var/autor)
where $contador >1
return
<Titulo>{$var/titulo}<numeroAutores>{$contador}</numeroAutores></Titulo>
for $var in /libros/libro
let $contador:= count($var/autor)
where $contador>1
return <Titulo>{$var/titulo/string(), <contador> {$contador} </contador>} </Titulo>
for $b in /libros/libro
let $a := $b/autor
where count($a) > 1
return $b/titulo
Modos de concatenación:
for $var in /libros/libro
let $contador:= count($var/autor)
where $contador>1
return <Titulo>{$var/titulo/string()}, {$var/año}, {$var/autor/nombre/string()}, {$contador} </Titulo>
3. Obtener los títulos de libro publicados con
posterioridad a 2004.
for $lib in /libros/libro
where $lib/año > 2004
return <titulo>{$lib/titulo, $lib/año}</titulo>
Funciona igual
for $b in /libros/libro
where $b/año > "2004"
order by $b/titulo
return $b/titulo
for $b in /libros/libro
where $b/año > "2004"
order by $b/titulo
return $b/titulo
4. Obtener por cada libro (código id) cuantos autores lo
han publicado.
for
$lib in /libros/libro
let
$numeroAutores := count ($lib/autor)
return
<Titulo><Id>{$lib/@id/string()}</Id>, {$lib/titulo}
<numeroAutores>{$numeroAutores}</numeroAutores></Titulo>
for $lib in /libros/libro
let $numeroAutores := count ($lib/autor)
return <Libro><Id>{$lib/@id/string()}</Id><Titulo> {$lib/titulo/string()}</Titulo> <numeroAutores>{$numeroAutores}</numeroAutores></Libro>
for $lib in /libros/libro
let $numeroAutores := count ($lib/autor)
return <Libro><Id>{$lib/@id/string()}</Id><Titulo> {$lib/titulo/string()}</Titulo> <numeroAutores>{$numeroAutores}</numeroAutores></Libro>
for $lib in /libros/libro
let $numeroAutores := count ($lib/autor)
return <Titulo>{$lib/titulo,
$numeroAutores}</Titulo>
5. Obtener por cada libro, su título y cuantos autores lo
han publicado.
for $lib in /libros/libro
let $numeroAutores := count ($lib/autor)
return <Titulo>{$lib/titulo}
<numeroAutores>{$numeroAutores}</numeroAutores></Titulo>
for $b in //libro
let $c := $b/autor
return
<libro>{ $b/titulo, <autores>{ count($c) }</autores>}</libro>
6. Obtener por cada libro, su id, título y cuantos
autores lo han publicado.
for $lib in /libros/libro
let $numeroAutores := count
($lib/autor)
return
<Libro><Id>
{$lib/@id/string()}</Id> {$lib/titulo, $numeroAutores}</Libro>
for $lib in /libros/libro
let $numeroAutores := count
($lib/autor)
return
<li><Titulo>{$lib/titulo, $numeroAutores}<Id>
{$lib/@*/string()}</Id></Titulo></li>
for $lib in /libros/libro
let $numeroAutores := count
($lib/autor)
return
<li><Titulo>{$lib/titulo, $numeroAutores}<Id>
{$lib/@*}</Id></Titulo></li>
for $b in //libro
let $c := $b/autor
return
<libro>{ $b/titulo, <autores>{ count($c) }</autores>}</libro>
for $lib in /libros/libro
let $numeroAutores := count ($lib/autor)
return <li><Titulo>{$lib/titulo} <NumAut>{$numeroAutores}</NumAut><Id> {$lib/@*/string()}</Id></Titulo></li>
for $b in //libro
let $c := $b/autor
return
<libro>{ $b/titulo, <autores>{ count($c) }</autores>}</libro>
for $lib in /libros/libro
let $numeroAutores := count ($lib/autor)
return <li><Titulo>{$lib/titulo} <NumAut>{$numeroAutores}</NumAut><Id> {$lib/@*/string()}</Id></Titulo></li>
7. Obtener los comentarios realizados de cada libro (documentos
libros_BD y comentarios).
8. Obtener por cada libro su título y autores, teniendo
en cuenta que si el libro tiene más de un autor figurará el primer autor y el
texto “et. Al”.
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then (<Libro>{$lib/titulo}, <Varios>{concat($rAutor[1],' et. Al')}</Varios></Libro>)
else (<li><Libro>{$lib/titulo}</Libro><unAutor>{$rAutor}</unAutor> </li>)
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then (<Libro>{$lib/titulo}, <Varios>{concat($rAutor[1],' et. Al')}</Varios></Libro>)
else (<Libro>{$lib/titulo}</Libro>,<unAutor>{$rAutor}</unAutor>)
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then (<Libro>{$lib/titulo}, <Varios>{concat($rAutor[1],' et. Al')}</Varios></Libro>)
else (<li><Libro>{$lib/titulo}</Libro><unAutor>{$rAutor}</unAutor> </li>)
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then (<Libro>{$lib/titulo}, <Varios>{concat($rAutor[1],' et. Al')}</Varios></Libro>)
else (<Libro>{$lib/titulo}</Libro>,<unAutor>{$rAutor}</unAutor>)
<!-- Con dos variables -->
for $b in //libro
let $a := string($b/autor[1]/apellidos)
let $n := string($b/autor[1]/nombre)
return <libro> { $b/titulo }
{
if (count($b/autor) > 1)
then <autor>{$a} , {$n} et al.</autor>
else <autor>{$a} , {$n}</autor>
}
</libro>
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then (<li><TituloLibro>{$lib/titulo/string()}</TituloLibro> <Varios>{concat($rAutor[1]/string(),' et. Al')}</Varios></li>)
else (<li><TituloLibro>{$lib/titulo/string()}</TituloLibro> <unAutor>{$rAutor/string()}</unAutor></li>)
let $a := string($b/autor[1]/apellidos)
let $n := string($b/autor[1]/nombre)
return <libro> { $b/titulo }
{
if (count($b/autor) > 1)
then <autor>{$a} , {$n} et al.</autor>
else <autor>{$a} , {$n}</autor>
}
</libro>
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then (<li><TituloLibro>{$lib/titulo/string()}</TituloLibro> <Varios>{concat($rAutor[1]/string(),' et. Al')}</Varios></li>)
else (<li><TituloLibro>{$lib/titulo/string()}</TituloLibro> <unAutor>{$rAutor/string()}</unAutor></li>)
<!-- De estaS maneras NO FUNCIONA
for $lib in /libros/libro
for $lib in /libros/libro
let $actor:=/lib/autor
let $numeroAutores := count ($lib/autor)
if ($numeroAutores > 2) then
(let $autor :=
$lib/autor)
return <li><Titulo>{$lib/titulo,
$numeroAutores}<Autor> {$autor}</Autor></Titulo></li>
for $lib in /libros/libro
for $lib in /libros/libro
let $autor:=$lib/autor
let $numeroAutores := count ($lib/autor)
if ($numeroAutores >2)
($autor:=
$lib/autor[position()=1])
return <li><Titulo>{$lib/titulo,
$numeroAutores}<Autor> {$autor}</Autor></Titulo></li (
for $lib in /libros/libro
let $rAutor :=$lib/autor
return
if (count($rAutor)>1)
then
(concat({$rAutor[1]}, (string (et. Al)
)), <Titulo>{$lib/titulo}</Titulo>,
<cuenta>{count($rAutor)}</cuenta></li>)
else
(<li><unAutor>{$rAutor}</unAutor>,
<Titulo>{$lib/titulo}</Titulo></li>)
-->
for $lib in /libros/libro
where ($lib/autor/apellidos =
"Alarcon" and
$lib/autor/nombre = "P.")
return
(<Titulo>{$lib/titulo}</Titulo>,<Autor>{$lib/autor}</Autor>)
10. Obtener el
título de aquellos libros en los que todos sus autores tengan el apellido Alarcon
y el nombre P.
for $b in //libro
where some $a in $b/autor
satisfies ($a/apellidos="Alarcon" and $a/nombre="P.")
return $b/titulo
for $b in //libro
where some $a in $b/autor
satisfies ($a/apellidos="Alarcon" and $a/nombre="P.")
return $b/titulo
11. Obtener el
título de aquellos libros en los que todos sus autores tengan el apellido DATE y el nombre
C.J.
for $lib in /libros/libro
where every $a in $lib/autor
satisfies ($a/apellidos = "DATE" and $a/nombre = "C.J.")
return
<TituloLibro>{$lib/titulo/string()} <Autor>{$lib/autor/nombre/string()}, {$lib/autor/apellidos/string()}</Autor></TituloLibro>
for $lib in /libros/libro
where every $a in $lib/autor
satisfies ($a/apellidos = "DATE" and $a/nombre = "C.J.")
return
<TituloLibro>{$lib/titulo/string()} <Autor>{$lib/autor/nombre/string()}, {$lib/autor/apellidos/string()}</Autor></TituloLibro>
12. Para aquellos
libros que se titulen “Bases de Datos”, obtener todos sus atributos y elementos, salvo
el de autor.
for $b in //libro
where $b/titulo = "Bases de Datos"
return
<libro>
{ $b/@* }
{ $b/* except $b/autor }
</libro
for $b in //libro
where $b/titulo = "Bases de Datos"
return
<libro>
{ $b/@* }
{ $b/* except $b/autor }
</libro
13. Obtener
aquellos libros que figuren sin editorial.
for $b in //libro
where empty($b/editorial)
return $b
for $b in //libro
where empty($b/editorial)
return $b
14. Obtener
aquellos libros que figuren con editorial.
for $b in //libro
where exists($b/editorial)
return $b
for $b in //libro
where exists($b/editorial)
return $b
15. Obtener los
libros publicados por la editorial Addison-Wesley después de 2005.
<libro>
{
for $b in /libros/libro
where $b/editorial = "Addison-Wesley" and $b/año > 2005
return
<libro año="{ $b/año }">
{ $b/titulo }
</libro>
}
</libro>
for $b in /libros/libro
where $b/editorial = "Addison-Wesley" and $b/año > 2005
return
<libro año="{$b/año }">
{ $b/titulo }
</libro>
<libro>
{
for $b in /libros/libro
where $b/editorial = "Addison-Wesley" and $b/año > 2005
return
<libro año="{ $b/año }">
{ $b/titulo }
</libro>
}
</libro>
for $b in /libros/libro
where $b/editorial = "Addison-Wesley" and $b/año > 2005
return
<libro año="{$b/año }">
{ $b/titulo }
</libro>
16. Obtener el
título de libro y editorial para aquellos libros que tengan un precio superior
a 50€.
for $b in /libros/libro
where $b/precio >50
return concat ($b/titulo, ", " ,$b/editorial, ", ", $b/precio, ";")
17. Mostrar por cada libro en libros_bd.xml los comentarios que tenga (fichero
comentarios.xml)
for $b in //libro, $a in doc("comentarios.xml")//comentario
where $b/titulo = $a/titulo
return
<libro-con-comentarios>
{ $b/titulo }
<comentario>{ $a/texto/text() } </comentario>
</libro-con-comentarios>
for $b in /libros/libro
where $b/precio >50
return concat ($b/titulo, ", " ,$b/editorial, ", ", $b/precio, ";")
17. Mostrar por cada libro en libros_bd.xml los comentarios que tenga (fichero
comentarios.xml)
for $b in //libro, $a in doc("comentarios.xml")//comentario
where $b/titulo = $a/titulo
return
<libro-con-comentarios>
{ $b/titulo }
<comentario>{ $a/texto/text() } </comentario>
</libro-con-comentarios>
18. Generar datos html con la lista de títulos de los libros.
<html>
<head> <title>Salida Html </title>
<body>
<table>
{
for $b in /libros/libro
return
<tr> <td> <I> { string( $b/titulo ) } </I> </td> </tr>
}
</table>
</body>
</head> </html>
No hay comentarios:
Publicar un comentario