viernes, 19 de mayo de 2017

Ejercicios de Xpath y Xquery



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]

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]

           
            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>
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

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 <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>
 

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>)


<!-- 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>)


 
<!-- De estaS maneras NO FUNCIONA
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
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


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>

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

13. Obtener aquellos libros que figuren sin editorial.
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

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>

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>

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