# XQuery

XQuery est un langage de requête informatique permettant non seulement d'extraire des informations d'un document XML, ou d'une collection de documents XML, mais également d'effectuer des calculs complexes à partir des informations extraites et de reconstruire de nouveaux documents ou fragments XML.
XQuery est une spécification du W3C dont la version 1.0 finale date de janvier 2007, et dont l'élaboration a demandé près de huit années. XQuery a été développé conjointement avec XSLT 2, une révision majeure du langage de transformation XML XSLT, avec lequel il partage le sous-ensemble XPath 2.0 (en).
XQuery joue par rapport aux données XML un rôle similaire à celui du langage SQL vis-à-vis des données relationnelles, et l'on peut trouver des analogies entre ces deux langages.

## Syntaxes

Il existe deux syntaxes distinctes pour XQuery :
* la syntaxe "naturelle" non-XML dite aussi FLWOR (prononcer flower), dont le nom vient des cinq clauses principales qui la composent (for, let, where, order by et return) ;
* la syntaxe XQueryX (pour « XML Syntax for XQuery »), dans laquelle une requête est un document XML. De ce fait, elle est beaucoup plus verbeuse et moins lisible que la précédente et est destinée à des manipulations formelles par des programmes (éventuellement eux-mêmes écrits en XQuery).

## Exemple

Soit le document XML suivant, situé à l'URL http://www.example.com/ et nommé exemple.xml :
La requête FLWOR suivante :
va renvoyer le résultat suivant :

## Composantes du langage

XQuery est un langage spécifié de façon modulaire : le cœur du langage peut être augmenté par des modules optionnels.
* Le langage minimal se base sur la norme XPath 2 (qui spécifie le langage de requête XML proprement dit), augmentée par les principales fonctionnalités suivantes :
** L'expression FLWOR (For Let Where Order by Return), une puissante instruction de boucle, avec de nombreuses fonctionnalités, qui est assez similaire au SELECT de SQL. Grâce au where, il est possible d'écrire des jointures internes ou externes. XQuery version 1.1 ajoute le group by, et le "fenêtrage" (possibilité de découper la séquence d'entrée selon des conditions booléennes). Il existe d'autres constructions telles que if et typeswitch qui peuvent se composer avec le FLWOR.
** Les constructeurs, des instructions permettant de reconstruire des fragments XML, avec une syntaxe très proche de XML lui-même (un fragment bien formé de XML est de fait une expression XQuery valide). Ceci permet d'écrire des modèles (templates) comportant des expressions évaluées dynamiquement, à la manière des nombreux langages (exemple : PHP) de génération de pages web.
** Les fonctions définies par l'utilisateur.
** Un ensemble de fonctions et opérateurs prédéfinis communs à XPath2, XQuery et XSLT 2.
Modules optionnels :
* Le module optionnel Full Axis (Axes étendus) permet de bénéficier des "axes" de requête ancestor, ancestor-or-self, following, following-sibling, preceding, et preceding-sibling dans une expression XPath.
* Les modules XQuery permettent d'importer des bibliothèques de fonctions ou de variables XQuery dans un programme XQuery.
* Le module optionnel Schema Import permet de spécifier les schémas XML auxquels répondent les données manipulées, permettant ainsi d'inférer les types de certaines expressions, et éventuellement d'optimiser les requêtes.
* Le module optionnel Schema Validation permet d'utiliser le mécanisme de validation de fragments XML par rapport à des schémas.
* Le module optionnel "Typage Statique" supporte des vérifications de type avant exécution plus poussées.
Extensions :
* XQuery Update est une norme en cours d'élaboration (norme préliminaire de 2010) étendant XQuery par des instructions de modification de nœuds XML : insert node, delete node, rename node, replace node, replace value, copy/modify.
* XQuery Full-Text est une extension en cours d'élaboration (norme préliminaire en 2008) spécifiant la recherche textuelle intégrée à XQuery. Elle permet la recherche contextuelle de mots et de phrases, c'est-à-dire restreinte par exemple au contenu d'un élément XML particulier.
* XQuery Scripting, en cours d'élaboration (Working Draft d'avril 2010), modifie le modèle de programmation pour ajouter des instructions impératives (blocs séquentiels, while, exit) garantissant l'ordre d'exécution.

## Caractéristiques du langage

* XQuery est un langage fonctionnel (où toute construction retourne une valeur) donc sans effet de bord, c'est-à-dire ne modifiant pas directement les données sur lesquelles il travaille. XQuery Scripting est une exception à ce principe.
* Contrairement à la plupart des langages fonctionnels, XQuery ne possède pas de fonctions de second ordre (pouvant être argument d'autres fonctions). Ceci change dans XQuery 1.1.
* XQuery peut optionnellement être fortement typé (au sens des Schémas XML) à la compilation et à l'exécution.
* Ces aspects sont partagés avec XSLT 2, qui est un langage proche de XQuery dans ses fonctionnalités.
* La programmation en XQuery est en général d'un style plus "impératif" qu'en XSLT, c'est-à-dire qu'elle nécessite la connaissance a priori de la structure des données XML manipulées. Inversement XSLT spécifie de façon déclarative des traitements sur chaque type de nœuds XML, indépendamment les uns des autres. La programmation en XQuery est donc plus naturelle, mais un peu moins puissante et modulaire qu'en XSLT.
* L'extension XQuery Scripting offre un modèle de programmation plus classique.

## Modèle de données

* Toutes les valeurs manipulées par XQuery (ainsi que XPath2 et XSLT 2) sont des séquences (ou listes) d'items. Il n'y a pas de séquences imbriquées : une séquence de séquences est toujours "mise à plat".
* Les items se répartissent en deux grands groupes :
** les nœuds XML, qui eux-mêmes sont de six espèces différentes : document, élément, attribut, texte, commentaire, processing-instruction.
** Les types de base (empruntés aux Schémas XML) au nombre de 48, comprenant notamment les types numériques (entiers, décimaux, flottants), les chaines de caractères et dérivés, les dates, instants et durées.
* Les types de bases peuvent être étendus par l'importation de Schémas (fonctionnalité optionnelle).
Exemples :
* L'expression 1 to 5 retourne la séquence d'items de type entier : 1 2 3 4 5.
* L'expression for $i in 1 to 5 return $i * $i retourne la séquence d'items de type entier : 1 4 9 16 25.
* L'expression for $i in 1 to 3 return <X>{ $i }</X> retourne la séquence de nœuds éléments : <X>1</X> <X>2</X> <X>3</X>.
* Une séquence n'est pas obligatoirement d'un type homogène. Par exemple l'expression (1, 2), 2.5, (true, "du texte") retourne la séquence d'items 1 2 2.5 true "du texte" de types respectivement entier (2 fois), décimal, booléen, chaine de caractères.