% ENC/ XSLT/ Fiche XPath % Jean-Damien Généro % 2025
Pour XPath, un document XML est un "tree of nodes" ("arbre avec des noeuds"). Chaque noeud est une "étape" possible dans une expression XPath. Il y a sept types de noeud :
- Notation :
/
. - Sélection : l'ensemble du document ; c'est le seul noeud "orphelin" (il ne peut pas avoir de parent). On parle parfois du document node.
- Attention : ne pas confondre avec l'élément racine (root element) d'un document XML :
<TEI>
est entièrement contenu dans le root node tout en étant le seul root element du document.
- Notation :
element()
. - Séléction : les éléments (i. e. balises) du document XML (entre
< >
).
- Notation :
attribute()
. - Sélection : les attributs des balises XML. Le parent direct d'un attribute node est forcément un element node.
- Notation :
text()
. - Sélection : le texte d'un element node ou d'un attribute node.
- Notation :
comment()
. - Sélection : les commentaires d'un document XML (notés entre
<!-- -->
). - Attention : comment node sélectionne le texte du commentaire sans les
<!-- -->
.
- Notation : via l'axe
namespace::
. - Sélection : les noms de domaine, généralement stockés dans des
xmlns:
. On y accède par l'expression/tag/namespace::*
. - Attention :
- Dans
<TEI xmlns="http://www.tei-c.org/ns/1.0">
,xmlns
n'est pas unattribute node
mais unnamespace node
. - Très peu utilisés en XSLT.
- Dans
- Notation :
processing-instruction()
. - Séection : les instructions de traitement XML (notées entre
<? ?>
), qui indiquent à une application comment traiter le document XML qu'elle lit. Elles possèdent un nom (name()
) et une valeur (string()
). - Exemple :
<?xml-stylesheet href="exemple.xsl" type="text/xsl" title="Exemple"?>
. - Attention : ne pas confondre avec l'entête XML (
<?xml version="1.0" encoding="UTF-8"?>
au début du document).
- Les axes (axis) permettent de s'émanciper de la direction de base parent>enfant d'un chemin XPath ou précisant ou en changeant cette direction.
- Il y a treize axes.
- Ils se notent avec des
::
à la fin ; certains peuvent être abrégés.
- Notation :
child::
. - Sélection : la balise hiérarchiquement inférieure au noeud de contexte.
- Attention :
- C'est l'axe par défaut, ce qui signie que
/child::TEI/child::teiHeader
est identique à/TEI/teiHeader
. - Les
attribute nodes
etnamespace nodes
sont exclus de cet axe.
- C'est l'axe par défaut, ce qui signie que
- Notation et abréviation :
parent::
et..
(deux points). - Sélection : la balise hiérarchiquement supérieure au noeud de contexte.
- Exemples :
//fileDesc/parent::teiHeader
et//fileDesc/..
sélectionnent le<teiHeader>
depuis le<fileDesc>
.
- Notation et abréviation :
self::
et.
(un point). - Sélection : le noeud de contexte.
- Notation et abréviation :
attribute::
et@
. - Sélection : les attributs du noeud de contexte.
- Attention : si le noeud de contexte est un attribute node, il n'y a pas d'axe attribut.
- Exemples :
//titleStmt/title/attribute::level
et//titleStmt/title/@level
sélectionnent l'attributlevel
de<title>
.
- Notation :
ancestor::
. - Sélection : tous les noeuds entre la balise hiérarchiquement supérieure au noeud de contexte (= le parent) et le premier du document (= le root node).
- Exemple :
//titleStmt/title/ancestor::fileDesc/sourceDesc//author
sélectionne tous les<author>
dans<sourceDesc>
depuis<title>
.
- Notation :
ancestor-or-self::
et//
. - Sélection : le noeud de contexte et
ancestor axis
.
- Notation et abréviation :
descendant::
. - Sélection : tous les enfants du noeud de contexte, et leurs enfants, et ainsi de suite.
- Exemple :
//descendant::sourceDesc
. - Attention : les
attribute nodes
etnamespace nodes
ne sont pas pris en compte par cet axe.
- Notation :
descendant-or-self::
. - Sélection : le noeud de contexte et
descendant axis
- Attention : les
attribute nodes
etnamespace nodes
ne sont pas pris en compte par cet axe.
- Notation :
preceding-sibling::
. - Sélection : tous les noeuds qui ont le même parent que le noeud de contexte et qui sont avant lui dans l'arbre.
- Exemples :
//sourceDesc/preceding-sibling::titleStmt
sélectionne le<titleStmt>
depuis le<sourceDesc>
;//sourceDesc/preceding-sibling::*
sélectionne le<titleStmt>
et le<publicationStmt>
.
- Notation :
following-sibling::
. - Sélection : tous les noeuds qui ont le même parent que le noeud de contexte et qui sont après lui dans l'arbre.
- Exemple :
//publicationStmt/following-sibling::sourceDesc
sélectionne le<sourceDesc>
depuis le<publicationStmt>
.
- Notation :
preceding::
. - Sélection : tous les noeuds qui précèdent le noeud de contexte, peu importe leur parent.
- Attention : les
ancestor
, lesattribute
et lesnamespace
ne sont pas pris en compte.
- Notation :
following::
. - Sélection : tous les noeuds qui suivent le noeud de contexte, peu importe leur parent.
- Attention : les
ancestor
, lesattribute
et lesnamespace
ne sont pas pris en compte.
- Notation :
namespace::
. - Sélection : les noms de domaine du noeud de contexte.
- Attention : ne fonctionne pas avec un attribute node.
XPath possède des fonctions prédéfinies :
- Elles sont reconnaissables par leurs
()
finales ; - Elles peuvent avoir un ou plusieurs arguments, ou ne pas en avoir du tout ;
- Dans XSLT, elles peuvent être utilisées dans les
@match
ou les@select
; - Elles peuvent retourner : une valeur booléenne (
true
oufalse
), un nombre, une chaîne de caractères (string
) ou une liste de noeuds (nodeset
) ; - Les opérateurs suivants sont utilisables avec les fonctions et prédicats :
- Opérateurs numériques :
+
,-
,*
,div
(division),mod
(modulo). - Opérateurs booléens :
<
,<=
,>
,>=
,=
,!=
,and
,or
.
- Opérateurs numériques :
Sélection de fonctions :
concat(string1, string2, ...)
: retourne la concaténation destring1
etstring2
(et plus).
-
upper-case(string)
: retournestring
en haut-de-casse ; -
lower-case(string)
: retournestring
en bas-de-casse.
-
translate(string, 'abc', 'ABC')
: retournestring
avec :a
remplacé parA
;b
remplacé parB
;c
remplacé parc
.- NB : le troisième paramètre n'a pas besoin d'être de la même taille que le deuxième. Avec
translate(string, 'abc', '')
, tous lesa
, lesb
et lesc
seront enlevés destring
. - Ce n'est pas l'équivalent d'un "rechercher/remplacer".
-
replace(string, 'abc', 'ABC')
: retournestring
avecabc
remplacé parABC
.- Peut être considéré comme l'équivalent d'un "rechercher/remplacer".
- Attention : ne fonctionne qu'à partir de XSLT version 2.
contains(string1, string2)
: retournetrue
oufalse
selon questring1
contienne (true
) ou ne contienne passtring2
(false
).
-
starts-with(string1, string2)
: retournetrue
oufalse
selon questring1
commence (true
) ou ne commence pas parstring2
(false
) ; -
ends-with(string1, string2)
: retournetrue
oufalse
selon questring1
se termine (true
) ou ne se termine pas parstring2
(false
) ;
not(arg)
: évaluearg
et retourne la valeur opposée.\\title[not(@level = 'm')]
renvoie tous les<title>
dont le@level
n'a pas pour valeurm
ainsi que ceux qui n'ont pas de@n
.- Attention : ce n'est pas l'équivalent de l'opérateur booléen
!=
.\\title[@level != 'm')]
renvoie tous les<title>
qui ont un@level
dont la valeur n'est pasm
. - Peut être combiné avec
contains()
sous la forme denot(contains(..., ...))
.
-
NB : dans XPath, la numérotation commence à
1
. -
last( )
: évalue la taille d'un ensemble de balises.- Exemple d'utilisation : appliquer une règle à la dernière balise d'un ensemble. Ainsi,
//div/p[last()]
renvoie tous les<p>
en dernière position dans les<div>
.
- Exemple d'utilisation : appliquer une règle à la dernière balise d'un ensemble. Ainsi,
-
position( )
: évalue la position d'une balise au sein de l'ensemble de balises auquel s'applique la règle courante.- Exemple d'utilisation : atteindre une balise en fonction de son emplacement. Ainsi,
//div/p[position() = 5]
renvoie tous les<p>
en cinquième position dans les<div>
. //div/p[position() = 5]
et//div/p[5]
sont deux expressions identiques.- Attention :
position( )
ne permet pas de déterminer la position de la balise par rapport à son parent.
- Exemple d'utilisation : atteindre une balise en fonction de son emplacement. Ainsi,
-
count(arg)
: évalue le nombre denode
et retourne ce nombre.- Le résultat est identique à
last()
, la différence étant quecount()
prend une expression XPath en argument. - Exemple d'utilisation : connaître le nombre total d'élément au sein d'un parent (comme le nombre de
<p>
au sein d'une<div>
).
- Le résultat est identique à
tokenize(string, delimiter)
: divise la chaînestring
en fonction d'undelimiter
.- Nouveauté de XSLT 2.
- Exemple d'utilisation : manipuler les valeurs multiples d'un attribut. Si
@type="maison campagne"
,tokenize(@type, ' ')
retourmaison
etcampagne
.