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.
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.
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.
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.
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.
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.
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 ().
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.
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:
<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>