Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

Developpez.com - XML
X

Choisissez d'abord la catégorieensuite la rubrique :


Predicats en Xpath 1.0

Date de publication : 01/01/06 , Date de mise à jour : 01/05/06

Par erwan amoureux (homepage)
 

Le fonctionnement des tests, parenthèses et prédicats en Xpath 1.0

I. Prédicat
I-A. Rappel sur les opérateurs xpath
I-B. Gestion des priorités entre opérateur
I-C. exemples
I-D. équivalences booléennes
II. Contexte d'évaluation
II-A. Déroulement d'un xpath et contexte
II-B. Action des parenthèses sur le contexte d'évaluation
III. Particularités de = et != sur des node-set
III-A. node-set = number
III-B. node-set = string
III-C. node-set = boolean
III-D. node-set = node-set
III-E. Différence entre not(node-set=..) et node-set!=..


I. Prédicat


I-A. Rappel sur les opérateurs xpath

  • + :l'addition
  • - :la soustraction
  • < :inférieur
  • > :supérieur
  • = : égalité
  • != :différence
  • div: division entière
  • mod: reste de la division
  • and : et logique
  • or: ou logique
  • not() (fonction plus qu'opérateur):non logique

I-B. Gestion des priorités entre opérateur

Tous les opérateurs sont associatifs par la gauche, ce qui veut dire, en cas d'égalité de priorité, que l'on commence par le plus à gauche. Les expressions numériques sont évaluées en premier:
mod, div, *
+,-
Ensuite les expressions booléennes
or
and
=, !=
<=, <, >=, >


I-C. exemples

5*4 mod 2   équivaut à (5*4) mod 2 soit 0
5 mod 2 * 4 équivaut à (5 mod 2) * 4 soit 4
4+2 div 2    équivaut à 4 + (2 div 2) soit 5
4+2 or 3-1   équivaut à (4+2) or (3-1) soit true() (une valeur numérique ou string est toujours vraie)
5+1 < 2     équivaut à (5+1) < 2 soit false() 3>2>5      équivaut à (3>2)>5 soit false()


I-D. équivalences booléennes

Un node-set est true() si il y existe un noeud (non vide).
Une chaîne (string) est true() si elle contient au moins un caractères.
Un nombre est true() si il est différent de zéro.


II. Contexte d'évaluation

une expression Xpath est évalué de gauche à droite en plusieurs étapes que séparent les /. A chaque étape , un contexte est évalué en fonction de celui qui a permis de passer à ce niveau.


II-A. Déroulement d'un xpath et contexte

Le contexte d'évaluation est le noeud en cours d'évaluation , il est représenté ici par la variable element_en_lecture. )

Soit le xpath /A/B[1]/C[position()=2 and .='4']:

résultat_final= NULL
element_en_lecture sur la racine
pour_tous les fils A de element_en_lecture
    element_en_lecture sur ce noeud
    position=0
    pour_tous les fils B de element_en_lecture
        positionB=positionB+1
        element_en_lecture sur ce noeud
        Si positionB=1 alors
            positionC=0
            pour_tous les fils C de element_en_lecture
                positionC=positionC+1
                element_en_lecture sur ce noeud
                Si positionC=2 et valeur de element_en_lecture=4 alors
                    c= résultat_final + element_en_lecture
                fin_si
            fin_pour_tous
        fin_si
    fin_pour_tous
fin_pour_tous


II-B. Action des parenthèses sur le contexte d'évaluation

L'utilisation de parenthèses permettra de créer un node-set "local".En effet, la rencontre d'une parenthèse droite crée en quelque sorte un résultat_final temporaire, sur lequel vont s'appliquer les prédicats et chemin xpath suivant.
Ainsi par exemple en utilisant le Xpath précèdent mais en entourant A/B de parenthèse le [1] ne s'applique plus sur le noeud contextuel comme précédemment mais sur le résultat de A/B (sélectionnant donc le premier noeud de ce résultat).L'algorithme sera donc le suivant:
Soit le xpath (/A/B)[1]/C[position()=2 and .='4']:

résultat_final= NULL
résultat_parenthèse= NULL
element_en_lecture sur la racine
pour_tous les fils A de element_en_lecture
    element_en_lecture sur ce noeud
    position=0
    pour_tous les fils B de element_en_lecture
    element_en_lecture sur ce noeud
    résultat_parenthèse= résultat_parenthèse + element_en_lecture
    fin_pour_tous
fin_pour_tous
positionB=0
pour_tous les noeuds de résultat_parenthèse
    element_en_lecture sur ce noeud
    positionB=positionB+1
    Si positionB=1 alors
        pour_tous les fils C de element_en_lecture
            positionC=positionC+1
            element_en_lecture sur ce noeud
            Si positionC=2 et valeur de element_en_lecture=4 alors
                c= résultat_final + element_en_lecture
            fin_si
        fin_pour_tous
    fin_si
fin_pour_tous


La règle d'écriture des parenthèses impose que toutes les parenthèses gauches doivent être placée au début du Xpath.
Ainsi:

  • (A/B)/C est exact
  • A/(B/C) est faux
  • ((A/B)/C) est exact
  • (A/(B/C))est faux
Les parenthèses séparant du reste de l'évaluation xpath on peut de fait y procéder à des unions:
(/A|/B)/C ramènera ici tous les enfants C des noeuds A ou B enfants de la racine.


III. Particularités de = et != sur des node-set


III-A. node-set = number

est vrai si un des noeuds du node-set possède une valeur textuelle (voir le cours sur les types xpath) à laquelle on applique la fonction number(convertit une chaîne en numérique) est égale à ce nombre.
A noter que number('001')=number('01')=1. node-set != number est vrai si un des noeuds du node-set ne satisfait pas l'exigence précédente.


III-B. node-set = string

est vrai si un des noeuds du node-set possède une valeur textuelle (voir le cours sur les types xpath) en tant que chaîne (fonction string()).
A noter que string('001')!=string('01'). node-set !=string est vrai si un des noeuds du node-set ne satisfait pas l'exigence précédente.


III-C. node-set = boolean

  • node-set = true() est vrai si le node-set n'est pas vide.
  • node-set = false() est vrai si le node-set est vide.
  • node-set != true() est vrai si le node-set est vide.
  • node-set != false() est vrai si le node-set n'est pas vide.

III-D. node-set = node-set

est vrai si un des noeuds du premier node-set possède une valeur textuelle (voir le cours sur les types xpath) en tant que chaîne (fonction string()) égal à celle d'un des noeuds du deuxième node-set.
node-set !=string est vrai si un des noeuds du premier node-set possède une valeur textuelle différente de celle d'un des noeuds du deuxième node-set.


III-E. Différence entre not(node-set=..) et node-set!=..

Comme dit plus haut node-set!=.. est vrai si un élément du node-set est différent
not(node-set=..) est vrai si tous les éléments du node-set ont des valeurs textuelles différentes.



Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Responsable bénévole de la rubrique XML : Didier Mouronval -