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 :
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 (/
)
chemin absolu (démarre à la racine du document)
/document/body/diapositive/title
chemin relatif au noeud courant
title
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]
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 :
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]
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
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')
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.
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
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 |
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à |
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]
XPath permet de faire l’union entre deux expressions par l’opérateur |
@*|node()
XPath 2.0