Introduction à XQuery
Diapositives Présenter ↗
Le diaporama utilise la bibliothèque
Reveal.js
(cliquez dans le cadre, puis appuyez sur la touche
f pour lancer le mode plein écran).
Introduction à XQuery
01 | Introduction à XQuery
ENS Lyon – septembre 2026
XQuery est un langage de requêtes et un langage de programmation fonctionnelle destiné à interroger et transformer des collections de données structurées et non structurées, principalement sous la forme de XML.
XML is a versatile markup language, capable of labeling the information content of diverse data sources including structured and semi-structured documents, relational databases, and object repositories. A query language that uses the structure of XML intelligently can express queries across all these kinds of data, whether physically stored in XML or viewed as XML via middleware. This specification describes a query language called XQuery, which is designed to be broadly applicable across many types of XML data sources.123
Depuis la version 3, XQuery prend également en charge le format léger d’échange de données JSON en ajoutant les maps et les arrays au modèle de données et en fournissant de nouvelles expressions et fonctions. La version 4 du langage (en cours de développement) introduit une extension de XPath pour les objets JSON. XQuery est donc applicable à un grand nombre de sources de données qu’elles soient encodées en XML ou représentée en JSON, en CSV ou au format texte.
Le langage opère notamment sur le modèle de données XML (XML Data Model (XDM)). Là où XSLT est destiné à transformer des données XML, XQuery est principalement destiné à faire des recherche dans des données XML. Il s’utilise habituellement avec une base de données XML capable d’indexer les nœuds d’un document XML. Mais c’est aussi un langage de programmation turing complet qui peut être utilisé dans de nombreuses applications. XQuery est principalement efficace lorsqu’il s’agit de manipuler ou de concilier des données de différents genre.
Historique
The mission of the XML Query working group is to provide flexible query facilities to extract data from real and virtual documents on the World Wide Web, therefore finally providing the needed interaction between the Web world and the database world. Ultimately, collections of XML files will be accessed like databases. (Mission statement of the XML Query working group)
Spécifications
- XQuery 1.0 recommandation du W3C le 23 janvier 2007
- XQuery 3.0 recommandation du W3C le 8 avril 2014
- XQuery 3.1 recommandation du W3C le 21 mars 2017
- XQuery 4.0 proposition de recommandation du qt4, 2026.
Voir aussi les spécifications XPath et XDM concernées
XQuery est un langage hôte de XPath. Ainsi, XPath est généralement un sous-ensemble de XQuery. Autrement dit, toute expression XPath sera une expression XQuery valide. Le langage XQuery apporte toutefois un certain nombre de fonctionnalités pour requêter et manipuler des données XML. La version 3.1 du langage étend XQuery pour travailler sur des données JSON en ajoutant des types maps et arrays au langage.
Extensions
Plusieurs extensions de XQuery peuvent s’avérer utiles : XQuery Update est destinée à faciliter la mise à jour de documents XML, XQuery Full-text sert à faire des recherches dans des chaînes de caractères. RestXQ propose une extension destinée à faciliter la réalisation d’applications REST.
Caractéristiques du langage
- Langage fonctionnel
- Turing complet
- Analogue à SQL
- Fondé sur XPath
- Standardisé par le W3C
L’évaluation de toute expression XQuery renvoie une séquence. Dans le XML Data Model (XDM), toutes les expressions XPath ramènent une séquence. Une séquence se compose de zéro, un ou plusieurs items. Les items peuvent être des littéraux, des valeurs atomiques ou des fonctions.
Rappels XPath
Syntaxe des littéraux
Entier (integer)
1
Chaîne de caractères (string)
'ceci est une chaîne de caractères'
"ceci est une chaîne de caractères"
Séquence (sequence)
1, 2, 3
(1, 2, 3)
Appels de fonction
string(16)
Concaténations et conversions
string(16+1)
concat((16+1), 1)
fn:concat('e', 1)
'e' || 1
Expression arithmétique
1 + 1 + 1
Test logique
true() != false()
(1+1) = 2
Expression conditionnelle
if (1 = 1) then 'oui' else 'non'
Forme des commentaires XQuery
XQuery est un langage souriant ! Les commentaires sont délimités par
les digrammes (: et :).
(: ceci est un commentaire :)
(:
: Ceci est un commentaire multiligne
:)
Expressions FLOWR
Les expressions FLOWR
foritère sur une séquence de nœuds ou d’éléments (boucle)letdéclare une variable et lui assigne une valeur ou un résultatwherefiltre les éléments selon un ou plusieurs critèresorder bytrie les résultats selon un ordre spécifique (croissant ou décroissant)returndéfinit la structure et le contenu du résultat final à afficher
XQuery ajoute à XPath un certain nombre d’instructions spécifiques
destinées à structurer des requêtes. On parle d’expression FLOWR pour
décrire les cinq clauses principales : for,
let, where, order by et
return.
foritère sur une séquence de nœuds ou d’éléments (boucle)letdéclare une variable et lui assigne une valeur ou un résultatwherefiltre les éléments selon un ou plusieurs critèresorder bytrie les résultats selon un ordre spécifique (croissant ou décroissant)returndéfinit la structure et le contenu du résultat final à afficher
Les clauses for et let peuvent être
utilisées plusieurs fois ou être combinées ensemble. Toute expression
FLOWR doit nécessairement se terminer par une clause
return. Les clauses where et
order by sont facultatives.
let $var := 'Salut !'
return $var
e
let $var := 'Salut !'
return $var || ' c’est le fun'
Mettre $var dans un élément XML
let $var := 'texte'
return
<p>{$var}</item>
Utilisation d’une boucle
for
for $i in (1, 2, 3)
return $i
for $i in (1, 2, 3)
return $i * $i
for $i in (1, 2, 3)
return if ($i mod 2 = 0) then $i * $i
Avec une clause let
let $seq := (3, 2, 1)
for $i in $seq
return $i + 1
Utilisation de
order by
let $seq := (3, 2, 1)
for $i in $seq
order by $i
return $i
let $seq := (3, 2, 1)
for $i in $seq
order by $i ascending (: descending :)
return $i
Travail avec un document XML
let $document := fn:doc("tei.xml")
for $persName in $document//tei:persName
where $persName/@id
order by $persName/@id
return $persName/text()
La clause where filtre les résultats
Création des nœuds XML
Le XML Data Model définit 7 types de nœuds. En XQuery, il est possible de créer des nœuds en utilisant des constructeurs directs (littéraux) ou bien en les computant.
Création des nœuds XML
Constructeurs directs
<p/> (: constructeur direct d’un élément XML p :)
<p xml:id="id01"/> (: constructeur direct d’un élément XML p vide avec un attribut @id qui avec la valeur id01 :)
Éléments computés
element p { '' } (: computation d’un élément XML p vide :)
element p {
attribute xml:id { 'id01' }
''
} (: computation d’un élément XML p vide avec un attribut @id qui avec la valeur id01 :)
Générer une séquence d’éléments XML
let $seq := (3, 2, 1)
for $i in $seq
return <item>{$i}</item>
Pour obtenir un document XML valide
<liste>{
let $seq := (3, 2, 1)
for $i in $seq
return <item>{$i}</item>
}</liste>
let $content :=
let $seq := (1, 2, 3)
for $i in $seq
return <item>{$i}</item>
return <liste>{$content}</liste>
Les fonctions
declare function nomDeFonction($param) {
'corps de la fonction'
};
Appels de fonction
nomDeFonction($param)
Typage de la fonction
declare function local:toto($param as xs:integer, $param2 as xs:string) as element()* {
<div>{
(<p>je suis une fonction</p>,
<p>{$param}</p>,
<p>{$param2}</p>,
$param3)
}</div>
};
local:toto(1, 'string', <element>element</element>)
declare function local:toto($param as xs:integer, $param2 as xs:string) as element() {
<div>
<p>je suis une fonction ressource </p>
<p>{$param}</p>
<p>{$param2}</p>
</div>
};
local:toto(1, 'string')
Travail avec la base de données
La création d’une base de données
db:get('gdp')
db:get('gdp')//*:title
let $get := db:get('gdp')
return $gdp//*:title
let $gdp := db:get('gdp')
for $titre in $gdp/*:title
return <h1>{$titre}</h1>
declare function local:titreGdp() {
let $gdp := db:get('gdp')
for $title in $gdp//*:title
return <h1>{$title//text()}</h1>
};
local:titreGdp()
declare function local:titreGdp( $edition ) {
let $gdp := db:get('gdp')
for $title in $gdp//*:title
return <h1>{$title//text()}</h1>
};
local:titreGdp('gdpBrice1684')
Modules
Créer un module, enregistrer le dans webapp/
xquery version "3.0" ;
module namespace local = "local" ;
declare
%restxq:path('mapage')
function local:toto($param as xs:integer, $param2 as xs:string, $param3 as element()) as element()* {
<div>
(<p>je suis une fonction</p>,
<p>{$param}</p>,
<p>{$param2}</p>,
{$param3})
</div>
};
Aller à localhost:8984
@todo montrer exemple sans param
ajouter les variables
xquery version "3.0" ;
module namespace local = "local" ;
declare
%restxq:path('mapage')
function local:toto($param as xs:integer, $param2 as xs:string, $param3 as element()) as element()* {
<div>
(<p>je suis une fonction</p>,
<p>{$param}</p>,
<p>{$param2}</p>,
{$param3})
</div>
};
xquery version "3.0" ;
module namespace local = "local" ;
declare
%restxq:path('/mapage/{$param}/{$param1}')
function local:toto($param as xs:string, $param2 as xs:string) {
<div>
(<p>je suis une fonction</p>,
<p>{$param}</p>,
<p>{$param2}</p>,
{$param3})
</div>
};
xquery version "3.0" ;
module namespace local = "local";
declare
%restxq:path('unchemin/{$edition}')
%output:method("html")
%output:html-version("5.0")
function local:titreGdp($edition as xs:string) {
let $gdp := db:open('gdp')
for $titre in $gdp//*:TEI[*:teiHeader/*:fileDesc/*:sourceDesc[@xml:id=$edition]]//*:head
return <h1>{fn:normalize-space($titre)}</h1>
};
Ressources utiles
Tutoriaux
- http://www.tutorialspoint.com/xquery/xquery_quick_guide.htm
- https://www.ibm.com/docs/en/db2-for-zos/11?topic=zos-xml
- https://docs.basex.org/main/XQuery