XPath

XPath est un langage de localisation. Il permet d’écrire des “chemin d’accès” pour se déplacer dans la structure d’un document XML (des sélecteurs). Il propose un ensemble de fonctions prédéfinies pour gérer les expressions booléennes, les nombres et les chaînes de caractères.

XPath est né d’un effort d’homogénéisation de la syntaxe et de la sémantique de fonctions communes à XSLT et XPointer.

Exemple d’utilisation de XPath (match, select):

<xsl:template match="modele">
<li>
    Modèle : <xsl:value-of select="@name"/>
</li>
</xsl:template>

Ressources :


Chemins de localisation

Une expression Xpath est composé d’une séquences d’étapes qui sélectionnent un ensemble de noeuds. Les étapes sont assemblées de gauche à droite et séparées par des slash (/)


Étapes

Une étape d’un chemin de localisation est constituée d’un axe (optionnel), d’un test de noeud et de 0 ou N prédicats.

axe::test[predicat]

Axe

L’axe sélectionne les noeuds candidats en fonction de leur relation aux noeuds du contexte (par exemple les enfants des noeuds sélectionnés).

Valeurs possibles :

child | parent | ancestor | descendant | following-sibling |
preceding-sibling | following | preceding | attribute | namespace |
descendant_or_self | ancestor_or_self

Axe horizontal :

attribute Sélectionne des attributs
following Sélectionne tous les noeuds suivants (hors descendants et ancêtres)
preceding Sélectionne tous les noeuds précédants (hors ancêtres)
following-sibling Sélectionne les noeuds suivants qui ont le même parent que le noeud courant
preceding-sibling Sélectionne tous les noeuds précédents qui ont le même parent que le noeud courant
namespace Déclarations de namespace dans le noeud courant

Axe vertical :

ancestor Sélectionne tous les ancêtres du noeud courant
ancestor-or-self Sélectionne tous les ancêtres du noeud courant en plus du noeud courant
descendant Sélectionne tous les noeuds contenus dans le noeud courant
descendant-or-self Sélectionne tous les contenus dans le noeud courant en plus du noeud courant
child Sélectionne tous les enfants du noeud courant (niveau + 1).
parent Sélectionne le parent du noeud courant (vide pour la racine)
self Sélectionne le noeud courant

Comparaisons :

Schéma différents axes

Exemples :

<!-- Sélectionne tous les attributs du noeud courant -->
attribute::*
<!-- Sélectionne l'attribut name du noeud courant -->
attribute::name
<!-- Sélectionne le prochain chapitre -->
following-sibling::chapter[position()=1]

abréviations

Version longue abréviation
child::para para
attribute::grade @grade
attribute::* @*
/descendant-or-self::node() //
self::node() .
parent::node() ..
child::para[position() = 1] para[1]
<!-- Sélectionne tous les attributs href
dans les descendants du noeud courant -->
.//@href

Test

Le test de noeud sélectionne les noeuds en fonction de leur type (texte, PI, element, etc) ou nom.

Valeurs possibles :

* | text() | node() |
<nodename> | <nsname>:* |
comment() | processing-instruction()
node() Sélectionne les noeuds (sauf les attributs et déclarations de namespace)
element, text, PI, comment
* Sélectionne les éléments et PI
element, PI
text() Sélectionne les noeuds texte
text
comment() Sélectionne les commentaire
comment
processing-instruction() Sélectionne les PI
PI
nodename Sélectionne les éléments nodename
nsname:* Sélectionne les éléments du namespace nsname

Exemples :

<!-- Sélectionne les éléments de <diapo> -->
diapo::*
<!-- Sélectionne les PI qui incluent des feuilles de style -->
processing-instruction('xml-stylesheet')

Prédicats

Les prédicats filtrent le résultat des noeuds trouvés.
Ils peuvent tester des booléens, des nombres, des chaînes de caractères, des ensembles de noeuds. Pour ce faire des opérations et des fonctions sont disponibles.

Booléens

Opérateurs: and, or, =, <, >, <=, >=
Fonctions:

boolean(object) Convertit ses arguments en booléens
not(boolean) Retourne le booléen inverse
true() Retourne true
false() Retourne false
lang(string) Retourne true or false selon la langue du noeud contextuel
<!-- Sélectionner les noeuds <chapitre>
qui ont au moins un enfant <titre>
dont le contenu est égal à "Introduction" -->
chapitre[titre="Introduction"]
<!-- Sélectionner les noeuds <para>
dont l'attribut type
a pour valeur "warning" -->
para[@type="warning"]
<!-- Sélectionner l'attribut name
des ingredients qui utilisent 1/2 cup -->
//ingredient[@amount='0.5' and @unit='cup']/@name 

Nombres

Opérateurs: +, -, DIV, MOD
Fonctions:

number(object) Convertit ses arguments en nombre
sum(nodes) Retourne la somme de la conversion de tous les noeuds passés en argument
floor(number) Retourne le plus grand nombre entier inférieur à l'argument
ceiling(number) Retourne le plus petit nombre entier supérieur à l'argument
round(number) Retourne le nombre entier le plus proche de l'argument

Chaînes de caractères

Fonctions:

string(object) Convertit ses arguments en chaîne de caractère
concat(string, string*) Retourne la concaténation des arguments
contains(string, needle) Indique si string contient needle
substring-before(string, needle) Retourne la sous-chaîne de string qui précède la 1ère occurence de needle
substring-after(string, needle) Retourne la sous-chaîne de string qui suit la 1ère occurence de needle
substring(string, offset, length) Retourne la sous-chaîne de string qui commence à offset et sur une longueur de length
string-length(string) Retourne le nombre de caractère de la chaîne
normalize-space(string) Retourne la chaîne après avoir normalisé les espaces (tirm, fusion multiple espaces)
translate(string, search, replace) Retourne string dans la lequelle toutes les occurences des caractères de search sont remplacés par les caractères de replace (positions correspondantesà

Ensemble de noeuds

last() Retourne la longueur de la dimension actuelle
position() Retourne la position actuelle
count(nodes) Retourne le nombre de noeuds de l'ensemble
id(string) Sélectionne les éléments par leur identifiant
local-name(nodes) Retourne la partie locale du nom du 1er noeud de l'ensemble
namespace-uri(nodes) Retourne l'URI du namespace du 1er noeud de l'ensemble
name(nodes) Retourne le nom expansé du 1er noeud de l'ensemble
<!-- Sélectionne le 5ème enfant <para> de l'élément qui a comme identifiant "foo" -->
id("foo")/child::para[position()=5]
<!-- Sélectionne les 5 premières sections -->
child::section[position()<6]

Union

XPath permet de faire l’union entre deux expressions par l’opérateur |

@*|node()

XPath 2.0

XPath 2.0