MiniTutorial XQuery (Xml-Query)

Introducción

XQuery es un lenguaje diseñado para recuperar información haciendo consultas a cualquier documento con organización XML (ficheros XML, bases de datos,...). Para una mejor comprensión, XQuery es como SQL a las bases de datos. Con estas consultas podemos obtener elementos o atributos de cualquier almacén de datos en formato XML.

XQuery está basado en expresiones XPath (comparten el mismo modelo de datos, funciones y operadores). Con estas expresiones podemos recuperar elementos o atributos XML.

Sintaxis

Para hacer una expresión XQuery utiliza varias cláusulas, las principales son:

FOR: cada nodo recuperado por la expresión, es vinculado a una única tupla.

Ejemplo de XQuery:

FOR $b IN doc("informacion.xml")//película/director
RETURN
<directores>$b</directores>

Recuperaría, todos los nodos <director> de todas las películas del documento:

<directores>
   <director>Peter Jackson</director>
</directores>
<directores>
   <director>Alejandro Amenabar</director>
</directores>
<directores>
   <director>Ethan Coen</director>
</directores>
<directores>
   <director>Joel Coen</director>
</directores>

LET: recupera todos los nodos en una única tupla.

Ejemplo de XQuery:

LET $b IN doc("informacion.xml")//película/director
RETURN
<directores>$b</directores>

Recuperaría:

<directores>
    <director>Peter Jackson</director>
    <director>Alejandro Amenabar</director>
    <director>Ethan Coen</director>
    <director>Joel Coen</director>
</directores>

WHERE: filtra la información de las tuplas devueltas por FOR o LET, recuperando únicamente aquellas que cumplen una expresión.

Ejemplo de XQuery:

LET $b IN doc("información.xml")//película/director
WHERE $b/../@fechaEstreno="19/12/2007"
RETURN
<directores>$b</directores>

Recuperaría, únicamente los directores que hubiesen estrenado película el día 19-12-2007 (Suponemos fechaEstreno es un atributo por ello ponemos @ delante, el /../ es para subir un nivel en el árbol XML donde está la información):

<directores>
    <director>Peter Jackson</director>
    <director>Alejandro Amenabar</director>
</directores>

ORDER: organiza la información recuperada. Por defecto, organiza por orden ascendente según el tipo de datos.

Ejemplo de XQuery:

FOR $b IN doc("información.xml")//película/director
ORDER BY $b/../titulo
RETURN
<directores>$b</directores>

Recuperaría, los directores ordenador por el titulo de sus películas:

<directores>
    <director>Alejandro Amenabar</director>
</directores>
<directores>
    <director>Ethan Coen</director>
</directores>
<directores>
    <director>Joel Coen</director>
</directores>
<directores>
    <director>Peter Jackson</director>
</directores>

RETURN: formatea la información de salida. Esto tiene muchas utilidades ya que puedes convertir la información recuperada a HTML, PDF, o cualquier otro.

Ejemplo de XQuery:

En los anteriores ejemplos ya utilizábamos la clausula RETURN para que nos devolviera los resultados entre los tags <directores>.

XQuery también admite expresiones condicionales IF-THEN-ELSE. Esta cláusula es útil para dar un formato diferente a la salida dependiendo de la información de esta, es decir, podemos cambiar la estructura de los nodos en los que recuperamos la información según nos convenga por su contenido. El ELSE es obligatorio pero puede ser únicamente ELSE ().

Ejemplo de XQuery:

FOR $b IN doc("información.xml")//película/director
RETURN
IF ($b = "Alejandro Amenabar") THEN
<espanol>{ $b }</espanol>
ELSE
<directores>{ $b }</directores>

Recuperaría, todos los nodos <director> de todas las películas del documento:


<directores>
    <director>Peter Jackson</director>
</directores>
<directores>
    <director>Alejandro Amenabar</director>
</directores>
<directores>
    <director>Ethan Coen</director>
</directores>

Cuantificadores existenciales. XQuery dispone de dos cuantificadores existenciales EVERY: recupera aquellas tuplas en las que todos los nodos cumplan la condición. SOME: recupera aquellas tuplas en las que algún nodo cumpla la condición.

Ejemplo de XQuery:

LET $b IN doc("información.xml")//película/titulo
WHERE SOME $a in $b/../director
SATISFIES ($a = "Ethan Coen")
RETURN
<titulos>$b</titulos>

Recuperaría los títulos de las películas en las que algún director fuera "Ethan Coen"

<titulos>
    <titulo>Sangre fácil</titulo>
    <titulo>No es país para pobres</titulo>
</ titulos >

Igual pero con EVERY:

LET $b IN doc("información.xml")//película/titulo
WHERE EVERY $a in $b/../director
SATISFIES ($a = "Ethan Coen")
RETURN
<titulos>$b</titulos>

Recuperaría los títulos de las películas en las que todos los directores (en este caso el único) fueran "Ethan Coen"

<titulos>
    <titulo>Sangre fácil</titulo>
</ titulos >
 

XQuery ofrece además funciones para la recuperación de información. Estas funciones son:

Xml que utilizamos para los Ejemplos de XQuery:

<pelicula fechaEstreno="19/12/2007">
    <titulo>Los Otros </titulo>
    <director>Alejandro Amenabar</director>
</pelicula>
<pelicula fechaEstreno="15/11/1986">
    <titulo>Sangre Facil </titulo>
    <director>Ethan Coen </director>
</pelicula>
<pelicula fechaEstreno="14/06/1990">
    <titulo>No es país para pobres </titulo>
    <director>Ethan Coen </director>
    <director>Joel Coen </director>
</pelicula>
<pelicula fechaEstreno="19/12/2007">
    <titulo> The Lovely Bones </titulo>
    <director> Peter Jackson</director>
</pelicula>

Recuperación Organización Información Tutorial XQuery Recuperación Organización Información Tutorial XQuery [Valid RSS]

Recuperación y organización de la información - Tutorial de XQuery