En este artículo vamos a:
- Presentar un fichero XML de ejemplo
libros2.xml
con varios libros. - Escribir las 8 consultas XQuery requeridas.
- Mostrar el resultado esperado de cada consulta.
1. Fichero XML de ejemplo (libros2.xml
)
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
<libro id="l1">
<titulo>Introducción a XML</titulo>
<autor>Autor A</autor>
<autor>Autor B</autor>
<editorial>Editorial X</editorial>
<year>2003</year>
<precio>35.50</precio>
</libro>
<libro id="l2">
<titulo>Bases de Datos</titulo>
<autor>Autor C</autor>
<editorial>Addison-Wesley</editorial>
<year>2006</year>
<precio>50.00</precio>
</libro>
<libro id="l3">
<titulo>Programación en Java</titulo>
<autor>Autor D</autor>
<editorial>Addison-Wesley</editorial>
<year>2005</year>
<precio>42.00</precio>
</libro>
<libro id="l4">
<titulo>Bases de Datos</titulo>
<autor>Autor E</autor>
<autor>Autor F</autor>
<year>2002</year>
<precio>45.00</precio>
</libro>
</biblioteca>
2. Consultas XQuery y resultados
2.1. Libros que incluyan <editorial>
for $b in doc("libros2.xml")//libro[editorial]
return $b
Resultado: los tres primeros libros (id=l1, l2 y l3).
<libro id="l1">…</libro>
<libro id="l2">…</libro>
<libro id="l3">…</libro>
2.2. Títulos de libros con más de un autor
for $b in doc("libros2.xml")//libro[count(autor) > 1]
return <titulo>{ $b/titulo/text() }</titulo>
Resultado:
<titulo>Introducción a XML</titulo>
<titulo>Bases de Datos</titulo>
2.3. Títulos de libros publicados después de 2004
for $b in doc("libros2.xml")//libro[year > 2004]
return $b/titulo
Resultado:
<titulo>Bases de Datos</titulo>
<titulo>Programación en Java</titulo>
2.4. Cada libro: título + número de autores
for $b in doc("libros2.xml")//libro
let $n := count($b/autor)
return <libro>
<titulo>{ $b/titulo/text() }</titulo>
<autores>{ $n }</autores>
</libro>
Resultado:
<libro><titulo>Introducción a XML</titulo><autores>2</autores></libro>
<libro><titulo>Bases de Datos</titulo><autores>1</autores></libro>
<libro><titulo>Programación en Java</titulo><autores>1</autores></libro>
<libro><titulo>Bases de Datos</titulo><autores>2</autores></libro>
2.5. Libros con precio > 40
for $b in doc("libros2.xml")//libro[number(precio) > 40]
return
<resultado id="{ $b/@id }">
{ $b/titulo }
{ $b/autor }
</resultado>
Resultado:
<resultado id="l2">
<titulo>Bases de Datos</titulo>
<autor>Autor C</autor>
</resultado>
<resultado id="l3">
<titulo>Programación en Java</titulo>
<autor>Autor D</autor>
</resultado>
<resultado id="l4">
<titulo>Bases de Datos</titulo>
<autor>Autor E</autor>
<autor>Autor F</autor>
</resultado>
2.6. “Bases de Datos”: todo salvo <autor>
for $b in doc("libros2.xml")//libro[titulo = "Bases de Datos"]
return
<libro id="{ $b/@id }">
{ $b/@* }
{ for $c in $b/*[name() != 'autor'] return $c }
</libro>
Resultado:
<libro id="l2">
<titulo>Bases de Datos</titulo>
<editorial>Addison-Wesley</editorial>
<year>2006</year>
<precio>50.00</precio>
</libro>
<libro id="l4">
<titulo>Bases de Datos</titulo>
<year>2002</year>
<precio>45.00</precio>
</libro>
2.7. Addison-Wesley publicados después de 2005
for $b in doc("libros2.xml")//libro
where editorial = "Addison-Wesley" and year > 2005
return $b
Resultado: sólo el libro id=»l2″.
<libro id="l2">…</libro>
2.8. Tabla HTML: título + lista de autores
let $tabla :=
<table border="1">
<tr><th>Título</th><th>Autores</th></tr>
{
for $b in doc("libros2.xml")//libro
return
<tr>
<td>{ $b/titulo/text() }</td>
<td>{ string-join($b/autor/text(), ", ") }</td>
</tr>
}
</table>
return $tabla
Resultado:
<table border="1">
<tr><th>Título</th><th>Autores</th></tr>
<tr><td>Introducción a XML</td><td>Autor A, Autor B</td></tr>
<tr><td>Bases de Datos</td><td>Autor C</td></tr>
<tr><td>Programación en Java</td><td>Autor D</td></tr>
<tr><td>Bases de Datos</td><td>Autor E, Autor F</td></tr>
</table>
¡Con esto tienes tanto el XML de ejemplo como todas las consultas XQuery resueltas y listas para pegar en tu proyecto!
