Zone infra

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

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

  • for itère sur une séquence de nœuds ou d’éléments (boucle)
  • let déclare une variable et lui assigne une valeur ou un résultat
  • where filtre les éléments selon un ou plusieurs critères
  • order by trie les résultats selon un ordre spécifique (croissant ou décroissant)
  • return dé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.

  • for itère sur une séquence de nœuds ou d’éléments (boucle)
  • let déclare une variable et lui assigne une valeur ou un résultat
  • where filtre les éléments selon un ou plusieurs critères
  • order by trie les résultats selon un ordre spécifique (croissant ou décroissant)
  • return dé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.

### Affecter et retourner une variable

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

### Définition d’une fonction

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

Notes


  1. http://www.w3.org/TR/xquery-10/↩︎

  2. http://www.w3.org/TR/xquery-30/↩︎

  3. http://www.w3.org/TR/xquery-31/↩︎

Zone extra