Predicats en Xpath 1.0Date de publication : 01/01/06 , Date de mise à jour : 01/05/06
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édicatI-A. Rappel sur les opérateurs xpath
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:
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-setIII-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
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.
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.
|