Saltar al contenido

Reconstrucción de libros2.xml y consultas XQuery paso a paso

En este artículo vamos a:

  1. Presentar un fichero XML de ejemplo libros2.xml con varios libros.
  2. Escribir las 8 consultas XQuery requeridas.
  3. 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).

&lt;libro id="l1"&gt;…&lt;/libro&gt;
&lt;libro id="l2"&gt;…&lt;/libro&gt;
&lt;libro id="l3"&gt;…&lt;/libro&gt;
  

2.2. Títulos de libros con más de un autor

for $b in doc("libros2.xml")//libro[count(autor) &gt; 1]
return &lt;titulo&gt;{ $b/titulo/text() }&lt;/titulo&gt;
  

Resultado:

&lt;titulo&gt;Introducción a XML&lt;/titulo&gt;
&lt;titulo&gt;Bases de Datos&lt;/titulo&gt;
  

2.3. Títulos de libros publicados después de 2004

for $b in doc("libros2.xml")//libro[year &gt; 2004]
return $b/titulo
  

Resultado:

&lt;titulo&gt;Bases de Datos&lt;/titulo&gt;
&lt;titulo&gt;Programación en Java&lt;/titulo&gt;
  

2.4. Cada libro: título + número de autores

for $b in doc("libros2.xml")//libro
let $n := count($b/autor)
return &lt;libro&gt;
         &lt;titulo&gt;{ $b/titulo/text() }&lt;/titulo&gt;
         &lt;autores&gt;{ $n }&lt;/autores&gt;
       &lt;/libro&gt;
  

Resultado:

&lt;libro&gt;&lt;titulo&gt;Introducción a XML&lt;/titulo&gt;&lt;autores&gt;2&lt;/autores&gt;&lt;/libro&gt;
&lt;libro&gt;&lt;titulo&gt;Bases de Datos&lt;/titulo&gt;&lt;autores&gt;1&lt;/autores&gt;&lt;/libro&gt;
&lt;libro&gt;&lt;titulo&gt;Programación en Java&lt;/titulo&gt;&lt;autores&gt;1&lt;/autores&gt;&lt;/libro&gt;
&lt;libro&gt;&lt;titulo&gt;Bases de Datos&lt;/titulo&gt;&lt;autores&gt;2&lt;/autores&gt;&lt;/libro&gt;
  

2.5. Libros con precio > 40

for $b in doc("libros2.xml")//libro[number(precio) &gt; 40]
return
  &lt;resultado id="{ $b/@id }"&gt;
    { $b/titulo }
    { $b/autor }
  &lt;/resultado&gt;
  

Resultado:

&lt;resultado id="l2"&gt;
  &lt;titulo&gt;Bases de Datos&lt;/titulo&gt;
  &lt;autor&gt;Autor C&lt;/autor&gt;
&lt;/resultado&gt;
&lt;resultado id="l3"&gt;
  &lt;titulo&gt;Programación en Java&lt;/titulo&gt;
  &lt;autor&gt;Autor D&lt;/autor&gt;
&lt;/resultado&gt;
&lt;resultado id="l4"&gt;
  &lt;titulo&gt;Bases de Datos&lt;/titulo&gt;
  &lt;autor&gt;Autor E&lt;/autor&gt;
  &lt;autor&gt;Autor F&lt;/autor&gt;
&lt;/resultado&gt;
  

2.6. “Bases de Datos”: todo salvo <autor>

for $b in doc("libros2.xml")//libro[titulo = "Bases de Datos"]
return
  &lt;libro id="{ $b/@id }"&gt;
    { $b/@* }
    { for $c in $b/*[name() != 'autor'] return $c }
  &lt;/libro&gt;
  

Resultado:

&lt;libro id="l2"&gt;
  &lt;titulo&gt;Bases de Datos&lt;/titulo&gt;
  &lt;editorial&gt;Addison-Wesley&lt;/editorial&gt;
  &lt;year&gt;2006&lt;/year&gt;
  &lt;precio&gt;50.00&lt;/precio&gt;
&lt;/libro&gt;

&lt;libro id="l4"&gt;
  &lt;titulo&gt;Bases de Datos&lt;/titulo&gt;
  &lt;year&gt;2002&lt;/year&gt;
  &lt;precio&gt;45.00&lt;/precio&gt;
&lt;/libro&gt;
  

2.7. Addison-Wesley publicados después de 2005

for $b in doc("libros2.xml")//libro
where editorial = "Addison-Wesley" and year &gt; 2005
return $b
  

Resultado: sólo el libro id=»l2″.

&lt;libro id="l2"&gt;…&lt;/libro&gt;
  

2.8. Tabla HTML: título + lista de autores

let $tabla :=
  &lt;table border="1"&gt;
    &lt;tr&gt;&lt;th&gt;Título&lt;/th&gt;&lt;th&gt;Autores&lt;/th&gt;&lt;/tr&gt;
    {
      for $b in doc("libros2.xml")//libro
      return
        &lt;tr&gt;
          &lt;td&gt;{ $b/titulo/text() }&lt;/td&gt;
          &lt;td&gt;{ string-join($b/autor/text(), ", ") }&lt;/td&gt;
        &lt;/tr&gt;
    }
  &lt;/table&gt;
return $tabla
  

Resultado:

&lt;table border="1"&gt;
  &lt;tr&gt;&lt;th&gt;Título&lt;/th&gt;&lt;th&gt;Autores&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Introducción a XML&lt;/td&gt;&lt;td&gt;Autor A, Autor B&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Bases de Datos&lt;/td&gt;&lt;td&gt;Autor C&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Programación en Java&lt;/td&gt;&lt;td&gt;Autor D&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Bases de Datos&lt;/td&gt;&lt;td&gt;Autor E, Autor F&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
  

¡Con esto tienes tanto el XML de ejemplo como todas las consultas XQuery resueltas y listas para pegar en tu proyecto!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

¿Atascado con tu proyecto? Presupuesto GRATIS

X
error: Content is protected !!
Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad