XPath

Table des matières :

Overview of XPath

XPath est un langage pour adresser des parties de documents XML, conçu pour être utilisé à la fois par XSLT et XPointer.
XPath représente les documents XML comme un arbre de noeuds. Il y a plusieurs types de noeuds, parmi lesquels les noeuds d'éléments, d'attributs et de texte. XPath fournit un mécanisme pour associer une valeur de type chaîne de caractères à chaque type de noeud. Certains ont également un nom. XPath supporte complètement les espaces de nom XML.

Axes / AxisName :

  • child : contient les enfants directs du noeud contextuel
  • descendant : contient les descendants du noeud contextuel; un descendant est un enfant ou un petit enfant etc... Aussi, l'axe descendant ne contient jamais de noeud de type attribut ou des noms d'espace.
  • parent : contient le parent du noeud contextuel, s'il y en a un
  • ancestor : contient les ancêtres du noeud contextuel; cela comprend son parent et les parents des parents etc... Aussi, cet axe contient toujours le noeud racine, sauf si le noeud contextuel est lui-même la racine.
  • following-sibling : (cible suivante) contient tous les noeuds cibles du noeud contextuel; si celui-là est un attribut ou un espace de noms, le suivant ciblé est vide.
  • preceding-sibling : (cible précédente) contient tous les prédécesseurs du noeud contextuel; si le noeud contextuel est un attribut ou un espace de noms, la cible précédente est vide.
  • following : tous les noeuds du même document que le noeud contextuel qui sont après le noeud contextuel dans l'ordre du document, à l'exclusion de tout descendant, des attributs et des espaces de noms.
  • preceding : contient tous les noeuds du même document que le noeud contextuel, qui sont avant lui dans l'ordre du document, à l'exclusion de tout ancêtre, des attributs et des espaces de noms.
  • attribute : contient les attributs du noeud contextuel; l'axe est vide quand le noeud n'est pas un élément
  • namespace : (espaces de noms) contient les noeuds des espaces de noms du noeud contextuel; l'axe est vide quand le noeud contextuel n'est pas un élément.
  • self : (réflexif) contient seulement le noeud contextuel
  • descendant-or-self : (descendant-ou-réflexif) contient le noeud contextuel et ses descendants.
  • ancestor-or-self : (ancêtres-ou-réflexif) contient le noeud contextuel et ses ancêtres; aussi, cet axe contiendra toujours le noeud racine.

Fonctions des ensembles de noeuds :

  • number last() : La fonction last retourne un nombre égal à la dimension contextuelle (context size) issue du contexte d'évaluation de l'expression.
  • number position() : La fonction position retourne un nombre égal à la position contextuelle context position issue du contexte d'évaluation de l'expression.
  • number count(node-set) : La fonction count retourne le nombre de noeuds de l'ensemble de noeuds passé en argument.
Autres fonctions :
  • node-set id(object)
  • string local-name(node-set?)
  • string namespace-uri(node-set?)
  • string name(node-set?)

Fonctions de chaînes de caractères :

  • string string(object?) : La fonction string convertie un objet en chaîne de caractères.
  • string concat(string, string, string*) : La fonction concat retourne le résultat de la concaténation des arguments.
  • boolean starts-with(string, string) : La fonction starts-with retourne la valeur booléenne true si la première chaîne de caractères passée en argument commence par la chaîne de caractères passée en 2ème argument; sinon, cette fonction retourne la valeur false.
  • boolean contains(string, string) : La fonction contains retourne true si la première chaîne de caractères passée en argument contient la chaîne de caractères passée en 2ième argument; sinon, retourne la valeur false.
  • string substring-before(string, string) : La fonction substring-before retourne la sous-chaîne de caractères du premier argument qui précède la première occurrence de la 2ième chaîne de caractères dans le premier argument, ou une chaîne vide si le premier argument ne contient aucune occurrence de la deuxième. Par exemple, substring-before("1999/04/01","/") retourne 1999.
  • string substring-after(string, string) : La fonction substring-after retourne la sous-chaîne de caractères du premier argument qui suit la première occurrence de la 2ième chaîne de caractères dans le premier argument, ou une chaîne vide si le premier argument ne contient aucune occurrence de la deuxième. Par exemple, substring-after("1999/04/01","/") retourne 04/01, et substring-after("1999/04/01","19") retourne 99/04/01.
  • string substring(string, number, number?) : La fonction substring retourne la sous-chaîne du premier argument commençant à la position spécifiée par le second argument et de longueur spécifiée par le troisième argument. Par exemple, substring("12345",2,3) retourne "234". Si le troisième argument n'est pas spécifié, la fonction retourne la sous-chaîne comprise entre la position de départ spécifiée et la fin de la chaîne de caractères initiale. Par exemple, substring("12345",2) retourne "2345".
    Attention : L'index du premier caractère est e premier (Contrairement à Java ).
    Les exemples suivants illustrent différents cas de figures courants :
    • substring("12345", 1.5, 2.6) retourne "234"
    • substring("12345", 0, 3) retourne "12"
    • substring("12345", 0 div 0, 3) retourne ""
    • substring("12345", 1, 0 div 0) retourne ""
    • substring("12345", -42, 1 div 0) retourne "12345"
    • substring("12345", -1 div 0, 1 div 0) retourne ""
  • number string-length(string?) : La fonction string-length retourne le nombre de caractères de la chaîne (cf [3.6 Strings]). Si l'argument est omis, la valeur retournée est égale à la longueur de la valeur textuelle du noeud contextuel.
  • string normalize-space(string?) : La fonction normalize-space retourne la chaîne de caractères passée en argument après y avoir normalisé les espaces blancs : suppression des espaces en début et fin et remplacement des séquences de blancs successifs par un seul caractère blanc. Les caractères blancs utilisés sont les mêmes que ceux définis par la règle de production S de XML. Si l'argument est omis, la fonction retourne la chaîne obtenue en ayant utilisé comme argument la valeur textuelle du noeud contextuel.
  • string translate(string, string, string) : La fonction translate retourne la première chaîne de caractères passée en argument dans laquelle les occurrences des caractères de la deuxième chaîne sont remplacées par les caractères correspondant aux mêmes positions de la troisième chaîne. Par exemple, translate("bar","abc","ABC") retourne la chaîne BAr. Si l'un des caractères du deuxième argument n'a pas de position correspondante dans le troisième (parce que le deuxième argument est plus long que le troisième), alors les occurrences de ce caractère sont supprimées du premier argument. Par exemple, translate("--aaa--","abc-","ABC") retourne "AAA". Si un caractère apparaît plus d'une fois dans la deuxième chaîne, alors c'est la première occurence de ce caractère qui détermine la règle de transformation. Si la chaîne passée en troisième argument est plus longue que la deuxième, alors, les caractères en trop sont ignorés.

Fonctions Booléennes :

  • boolean boolean(object) : La fonction boolean converti ses arguments en booléens selon les règles suivantes :
    • un nombre est vrai (true) si et seulement s'il n'est ni un zéro positif ou négatif, ni un NaN
    • un ensemble de noeuds est vrai (true) si et seulement s'il n'est pas vide
    • une chaîne de caractères est vrai (true) si et seulement si sa longueur n'est pas nulle
    • un objet d'un type autre que les 4 de base est converti selon des règles spécifiques à chaque type.
  • boolean not(boolean): La fonction not retourne l'inverse de la valeur du booléen passé en argument : vrai (true) si l'argument est faux et vice-versa.
  • boolean true() : La fonction true retourne true.
  • boolean false() : La fonction false retourne false.
  • boolean lang(string) : La fonction lang retourne true ou false selon que la langue du noeud contextuel telle que spécifiée par les attributs xml:lang est la même ou est un sous-langage de la langue passée en argument (peut utiliser le plus proche ancêtre du noeud contextuel ayant cet attribut).

Fonctions Numériques :

  • number number(object?) : La fonction number convertit l'argument passé en nombre selon les règles suivantes :
    • une chaîne de caractères qui est composée de blancs (optionnels) suivis du signe moins (-) suivi d'un nombre (Number) suivi de blancs est convertie en le nombre conforme à la norme IEEE 754 le plus proche (selon la règle d'arrondi au plus proche de l'IEEE 754) de la valeur mathématique représentée par la chaîne; toute autre chaîne est convertie en NaN
    • les booléens vrais (true) sont convertis en 1; les booléens faux (false) sont convertis en 0
    • un ensemble de noeuds est d'abord converti en chaîne de caractères comme avec la fonction string et cette chaîne est ensuite considérée comme argument à la fonction number
    • un objet de type différent des 4 types de base est converti en un nombre selon des règles dépendantes du type de l'objet
    • Si l'argument est omis, la valeur retournée par défaut est celle qui aurait été obtenue en considérant un ensemble de noeuds contenant le seul noeud contextuel.
    • NOTE : La fonction number ne doit pas être utilisée pour convertir des données numériques se trouvant dans un élément d'un document XML sauf si l'élément en question est d'un type permettant de représenter des données numériques dans un format neutre (qui serait typiquement transformé dans un format spécifique pour être présentées à un utilisateur). De plus, la fonction number ne peut pas être utilisée sauf si le format neutre utilisé par l'élément est cohérent avec la syntaxe XPath définie pour les nombres (Number).
  • number sum(node-set) : La fonction sum retourne la somme, pour tous les noeuds de l'ensemble de noeuds passé en argument, du résultat de la conversion en nombres des valeurs textuelles (string-values) du noeud.
  • number floor(number) : La fonction floor retourne le plus grand (du côté de l'infini positif) nombre entier inférieur à l'argument.
  • number ceiling(number) : La fonction ceiling retourne le plus petit (du côté de l'infini négatif) nombre entier qui ne soit pas inférieur à l'argument.
  • number round(number) : La fonction arrondi (round) retourne le nombre entier le plus proche de l'argument. S' il y a 2 nombres possibles, alors celui des deux qui est le plus proche de l'infini positif est retourné. Si l'argument est NaN, alors NaN est retourné. Si l'argument est l'infini positif, alors l'infini positif est retourné. Si l'argument est l'infinité négatif, alors l'infini négatif est retourné. Si l'argument est zéro positif, alors zéro positif est retourné. Si l'argument est le zéro négatif, alors le zéro négatif est retourné. Si l'argument est inférieur à zéro, mais plus grand ou égal à -0.5, alors le zéro négatif est retourné.
    • NOTE : Pour les 2 derniers cas, le résultat de l'appel de la fonction arrondi (round) ne donne pas le même résultat qu'en additionnant 0.5 et exécuter la fonction floor.

Opérateurs booléens :

  • or : représente un OU logique.
  • and : représente un ET logique.
  • not() : signifie la négation ou NON logique.
  • | : permet la sélection de plusieurs motifs.
  • = : représente l'égalité.
  • != : signifie différent de...
  • < : signifie inférieur à...
  • <= : signifie inférieur ou égal à...
  • > : signifie supérieur à...
  • >= : signifie supérieur ou égal à...

Les opérateurs de calculs :

  • + : effectue une addition.
  • - : effectue une soustraction.
  • div() : effectue une division.
  • mod() : effectue un modulo.

Exemples :

Ci-après sont présentés quelques exemples de chemins de localisation utilisant une syntaxe non-abrégée :
  • child::para : sélectionne l'élément para enfant du noeud contextuel
  • child::* : sélectionne tous les éléments enfant du noeud contextuel
  • child::text() : sélectionne tous les noeuds textuels du noeud contextuel
  • child::node() : sélectionne tous les enfants du noeud contextuel, quelque soit leur type
  • attribute::name : sélectionne l'attribut name du noeud contextuel
  • attribute::* : sélectionne tous les attributs du noeud contextuel
  • descendant::para : sélectionne tous les descendants para du noeud contextuel
  • ancestor::div : sélectionne tous les ancêtres div du noeud contextuel
  • ancestor-or-self::div : sélectionne tous les ancêtres div du noeud contextuel et le noeud contextuel lui-même si c'est un div
  • descendant-or-self::para : sélectionne tous les descendants para du noeud contextuel et le noeud contextuel lui-même si c'est un para
  • self::para : sélectionne le noeud contextuel si c'est un élément para, et rien dans le cas contraire
  • child::chapter/descendant::para : sélectionne les descendants para de l'element chapitre enfant du noeud contextuel
  • child::*/child::para : sélectionne tous les petits enfants para du noeud contextuel
  • / : sélectionne la racine du document (qui est toujours le parent de l'élément document)
  • /descendant::para : sélectionne tous les éléments para descendants du document contenant le noeud contextuel
  • /descendant::olist/child::item : sélectionne tous les éléments item qui ont un parent olist et qui sont dans le même document que le noeud contextuel
  • child::para[position()=1] : sélectionne le premier enfant para du noeud contextuel
  • child::para[position()=last()] : sélectionne le dernier enfant para du noeud contextuel
  • child::para[position()=last()-1] : sélectionne l'avant dernier para enfant du noeud contextuel
  • child::para[position()>1] : sélectionne tous les enfants para du noeud contextuel autres que le premier
  • following-sibling::chapter[position()=1] : sélectionne le prochain chapter cible du noeud contextuel
  • preceding-sibling::chapter[position()=1] : sélectionne le précédent chapter cible du noeud contextuel
  • /descendant::figure[position()=42] : sélectionne le 42ième élément figure du document
  • /child::doc/child::chapter[position()=5]/child::section[position()=2] : sélectionne la 2ième section du 5ième élément chapter de l'élément doc du document
  • child::para[attribute::type="warning"] : sélectionne tous les enfants para du noeud contextuel qui ont un attribut type dont la valeur est warning
  • child::para[attribute::type='warning'][position()=5] : sélectionne le 5ième enfant para du noeud contextuel qui a un attribut type dont la valeur est warning
  • child::para[position()=5][attribute::type="warning"] : sélectionne le 5ième enfant para du noeud contextuel si celui-là a un attribut type de valeur warning
  • child::chapter[child::title='Introduction'] : sélectionne l'enfant chapter du noeud contextuel qui a un ou plus enfant title avec un contenu textuel égal à 'Introduction'
  • child::chapter[child::title] : sélectionne l'enfant chapter du noeud contextuel qui a un ou plus enfant title
  • child::*[self::chapter or self::appendix] : sélectionne tous les enfants chapter et appendix du noeud contextuel
  • child::*[self::chapter or self::appendix][position()=last()] : sélectionne le dernier enfant chapter ou appendix du noeud contextuel

Type de Noeud (7 types ) :

  • les noeuds racines
  • les noeuds d'éléments
  • les noeuds de texte
  • les noeuds attributs
  • les noeuds d'espaces de noms
  • les noeuds d'instructions de traitement
  • les noeuds commentaires



Article extrait du site Loribel.com.
https://loribel.com/java/topics/xpath.html