XQuery/Expression FLWOR

Méthode

modifier

Pour créer un rapport contenant les éléments d'une séquence, on peut utiliser une expression FLWOR XQuery basique, afin d'itérer à travers chacun. Les cinq parties d'une expression FLWOR sont :

  • for (optionnel) : spécifie les éléments de la séquence à sélectionner.
  • let (optionnel) : crée temporairement les noms à utiliser en retour.
  • where (optionnel) : limite les éléments retournés.
  • order (optionnel) : change l'ordre des résultats.
  • return (requis) : spécifie la structure des données retournées.

Soit l'échantillon du fichier de livres catalog.xml suivant :

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <title>Introduction to XQuery</title>
      <description>A beginner's guide to XQuery that covers sequences and FLOWR expressions</description>
      <type>softcover</type>
      <sales-count>155</sales-count>
      <price>$19.95</price>
   </book>
  <book>
      <title>Document Transformations with XQuery</title>
      <description>How to transform complex documents like DocBook, TEI and DITA</description>
      <type>hardcover</type>
      <sales-count>105</sales-count>
      <price>$59.95</price>
   </book>
   ...more books here....
 </books>

Voici un exemple simple d'une expression FLWOR pour renvoyer les titres et prix des livres classés par titre :

for $book in doc("catalog.xml")/books/book
   let $title := $book/title/text()
   let $price := $book/price/text()
   where xs:decimal($price) gt 50.00
   order by $title
   return
      <book>
         <title>{$title}</title>
         <price>{$price}</price>
      </book>

Cette expression FLWOR XQuery retourne tous les livres qui ont un prix supérieur à 50,00 $ (l'exemple en contient juste un, mais deux après la boucle). Les clauses where restreignent les résultats aux livres au-dessus de 50,00 $. Les résultats sont classés par titre et le résultat est une nouvelle séquence d'éléments livre avec prix et titre.

Utilisation de la fonction "to" pour générer une page de valeurs

modifier

Il est également possible d'exprimer une plage de valeurs d'un nombre à un autre en plaçant le mot clé "to" entre deux nombres dans une séquence.

Le code suivant génère une liste de valeurs entre 1 et 10 :

xquery version "1.0";

<list>
   {for $i in (1 to 10)
      return
        <value>{$i}</value>
    }
</list>

Utilisation de la fonction "at" comme compteur

modifier

"at $compteur" ajoute un compteur pour chaque élément dans une boucle FLOWR :

for $item at $count in $items
   return
      <item>
         <counter>{$count}</counter>
         {$item/*}
      </item>

Comparaison de FLWOR avec la programmation procédurale pour les boucles

modifier

Dans la programmation procédurale traditionnelle (JavaScript, Java, .Net, Perl, PHP et Python), chaque boucle est exécutée séquentiellement, l'une après l'autre. Par contre la boucle FLWOR exécute chaque itération en parallèle, et aucune communication n'est autorisée entre les threads. Par conséquent il n'est pas possible d'incrémenter les variables "traditionnellement".