Developpez.com - XML
X

Choisissez d'abord la catégorieensuite la rubrique :


Les bases du langage XQuery

Date de publication : 04/12/2005

Par François ROLE (autres articles)
 

Cet article donne un éclairage sur des notions importantes du langage XQuery, les séquences et les items.


I. Deux notions importantes : séquence et items
II. Créer une séquence
II-a. Premiers essais
II-b. Créer des séquences hétérogènes


I. Deux notions importantes : séquence et items

En XPath 2.0 et en XQuery 1.0, l'évaluation d'une expression produit toujours une « séquence », c'est-à-dire une collection ordonnée de zéro, un ou plusieurs "items". Un item d'une séquence est soit une valeur atomique (atomic value) soit un noeud (node).

Les valeurs atomiques correspondent aux valeurs ayant un type atomique au sens de XML Schema. Schématiquement, un type atomique est un type primitif tel qu'on en manipule couramment dans les expressions des langages de programmation typés :

  • boolean : l'une des deux valeurs true et false
  • string : une chaîne composée de caractères Unicode
  • etc.
Pour donner quelques exemples simples  : 5 ou "coucou" sont des valeurs atomiques au sens de XML Schema et donc dans le modèle de données XPath/XQuery. Les noeuds correspondent, quant à eux, aux noeuds de l'arbre d'un document XML. On en distingue sept sortes (document node, element node, attribute node, comment node, processing instruction node, text node, namespace node). Il est à noter que les noeuds ont une identité : deux noeuds créés par deux expressions différentes sont deux noeuds distincts, même s'ils ont le même nom, les mêmes fils etc. On est là proche de la notion d'identité d'objet utilisée en programmation orientée-objet.


II. Créer une séquence


II-a. Premiers essais

La façon la plus simple de créer une séquence est d'utiliser l'opérateur virgule (comma) noté , . Cet opérateur évalue chacune de ses opérandes et concatène les valeurs obtenues pour former une séquence. A titre d'exemple, la requête ci-dessous crée une séquence d'entiers 1 2 3 4 : (1)
xquery version "1.0"
1,2,3,4
Quant à la requête ci-dessous :
xquery version "1.0"
"aa","bb","cc"
elle produit la séquence de chaînes :
"aa" "bb" "cc"
Au delà de ces cas évidents, que se passe-t-il maintenant si l'on essaie d'inclure une séquence dans une autre séquence ?

Evaluez par exemple (10, (1,2), (), (3, 4)) et vous obtiendrez la séquence 10 1 2 3 4.

Ceci illustre le fait qu'une séquence ne peut jamais être un item dans une autre séquence. Quand une séquence est incluse dans une autre séquence elle est "aplatie" et ses éléments (items) deviennent des éléments de la séquence englobante.

A noter que, si l'on veut créer une séquence d'entiers consécutifs, il existe un raccourci pratique, l'opérateur to. Par exemple, l'expression 1 to 4 crée la même séquence que l'expression 1,2,3,4, c'est-à-dire la séquence 1 2 3 4.

On peut aussi utiliser à la fois l'opérateur , et l'opérateur to comme par exemple dans l'expression (10, 1 to 4).


II-b. Créer des séquences hétérogènes

Jusqu'ici nous n'avons donné que des exemples de séquences contenant des valeurs atomiques. Mais nous avons rappelé au début de cet article qu'une séquence contient plus généralement des items, c'est-à-dire des valeurs atomiques ou des noeuds. Il existe en effet des fonctions XQuery permettant d'accéder à la séquence de noeuds qui composent un document XML. La fonction fn:doc($uri as xs:string?) renvoie ainsi une séquence singleton contenant le noeud document du document XML dont l'URI est donné en paramètre. Le noeud ainsi renvoyé peut alors servir de point de départ à une navigation dans le document. Par exemple, soit le document XML ci-dessous :
<fruits>
  <pomme>
    <quantité>5</quantité>
    <qualité>A</qualité>
  </pomme>
  <orange>
    <quantité>7</quantité>
    <qualité>B</qualité>
  </orange>
  <mandarine>
    <quantité>12</quantité>
    <qualité>A</qualité>
  </mandarine>
</fruits>
L'évaluation de l'expression doc("fruits.xml")//quantité va renvoyer une séquence contenant les trois noeuds éléments dont le nom est quantité :
<quantité>5</quantité> <quantité>7</quantité> <quantité>12</quantité>
Il est alors possible d'utiliser cette expression pour créer des séquences en combinaison avec l'opérateur virgule comme dans :
1 , 2 , doc("fruits.xml")//quantité , 3 , 4
qui produit une séquence de sept éléments :
1 2 <quantité>5</quantité> <quantité>7</quantité> <quantité>12</quantité> 3 4
Au passage cet exemple nous rappelle comment XQuery traite une séquence insérée dans une séquence... Pourquoi a-t-on sept éléments (items) et pas cinq ?

Dans un prochain article nous examinerons des fonctions et des opérateurs permettant non seulement de créer des séquences mais également de les explorer et de les manipuler.



(1)Nous notons les séquences en séparant simplement chacun de leurs éléments (items) par un espace.

Valid XHTML 1.1!Valid CSS!

Copyright © 2005 François Role. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsable bénévole de la rubrique XML : Didier Mouronval -