XPath
1. Introduction
Le langage XPath est un standard du W3C pour décrire
des "patterns" (localisation de noeud) et extraire des
valeurs de l'arbre du document XML. Il sert en fait 2 autres "standards"
XML :
- XSLT : partie
de XSL, ensemble de règles de transformation d'un documen
XML vers un autre document.
- XPointer : mécanisme de pointage pour les liens XLink
de XML.
Les résultats des expressions XPath sont des noeuds
(simple ou des ensembles), un booléan, un nombre, ou une
chaine de carcatères en Unicode.
|
Exemple de document XML : famille_atome.xml |
<?xml version="1.0" encoding="iso-8859-1" ?>
<classification_atomique>
<famille type="gaz rare">
<atome>
<nom>hélium</nom>
<symbole>He</symbole>
<numero>2</numero>
<masse>4</masse>
</atome>
<atome>
<nom>néon</nom>
<symbole>Ne</symbole>
<numero>10</numero>
<masse>20</masse>
</atome>
<atome>
<nom>argon</nom>
<symbole>Ar</symbole>
<numero>18</numero>
<masse>40</masse>
</atome>
</famille>
<famille type="métal alcalin">
<atome>
....
|
2. Chemin
En fait, une grande partie de XPath décrit des chemins
dans une arborescence.
Supposons que le noeud courant soit <famille type="gaz
rare">
- / sélectionne
l'élément racine du document, donc <classification_atomique>
- /famille sélectionne
les éléments famille fils de l'élément
racine
- atome sélectionne
les éléments atome fils du noeud courant
- ./atome comme atome
- atome/nom sélectionne
les éléments nom fils d'un élément
atome fils du noeud courant
- .. sélectionne
l'élément père, donc <classification_atomique>
- ../famille sélectionne
les éléments famille fils du père du noeud
courant
- //atome sélectionne
les éléments atome fils du fils de l'élément
racine
- .//nom sélectionne
les éléments nom fils d'un élément
fils du noeud courant
- * sélectionne
tous les éléments fils du noeud courant
- atome/* sélectionne
tous les éléments fils d'un élément
atome fils du noeud courant
- @type sélectionne
l'attribut type du noeud courant
- /famille/@type sélectionne
l'attribut type des éléments famille fils de l'élément
racine
- @* sélectionne
tous les attributs du noeud courant
- ./atome | .//nom union
des 2 sélections
- atome/node() sélectionne
tous les noeuds (pas uniquement les noeuds éléments)
fils d'un élément atome fils du noeud courant
- comment() tous les noeuds
commentaire du noeud courant
- processing-instruction()
idem
2. Axe
Les axes décrivent les directions des chemins dans une
arborescence : racine, parent, noeud courant, descendant, ......
les axes s'utilisent ainsi : axe :: chemin
Supposons que le noeud courant soit <famille type="gaz
rare">
- descendant :: atome sélectionne
les noeuds fils de l'élément atome fils du noeud
courant
- following-sibling ::
. sélectionne les noeuds frères du nueud courant
se trouvant après ce noeud courant
- self désigne le
noeud courant
- child les noeuds fils
- ancestor tous les noeuds
de la branche du noeud courant
- preceding-sibling
- following :: parent :: .
tous les noeuds suivants le noeud parent du noeud courant
- preceding tous les noeuds
précédent le noeud courant dans le document
- attribute les attributs
du noeud
- namespace les noeuds
de type namespace
2. Prédicat
Les prédicats sont utilisés dans les tests de
XSLT.
De plus, l'ensemble des noeuds obtenus par un chemin XPtah peut
être filtré à l'aide de prédicats entre
crochets [].
Supposons que le noeud courant soit <famille type="gaz
rare">
- ./atome[3] sélectionne
le 3ème élément atome fils du noeud courant
- ./atome[position()=3]
sélectionne l'élément atome fils du noeud
courant dont le position est en 3ème place.
- atome[last()] sélectionne
le dernier élément atome fils du noeud courant
- atome[numero!=4] sélectionne
les éléments atome fils du noeud courant dont le
numero est différent de 4
- atome[numero >=
4] ... dont le numéro est >= 4. Remarquons qu'il faut
utiliser < (respectivement >) à la place
de < (resp. >) dans les documents XML; exemple :<xsl:if
test="numero < 10">...</xsl:if>
- following-sibling :: .[@type="non
métal"] sélectionne les noeuds
famille frère (suivant dans le document) du noeud courant
dont l'attribut type vaut "non métal"
- atome[masse mod 2 =1]
sélectionne les éléments atome fils du noeud
courant dont la masse est impair.
- ../famille[(@type="non métal") and (atome/masse > 34)] sélectionne
les noeuds famille fils du père du noeud courant dont
l'attribut type vaut "non métal" et dont l'un
des fils atome a un fils masse dont le contenu est > à
34.
- ../famille[@type="non métal"]/atome[masse
> 34] sélectionne les noeuds atome,
ayant un fils masse dont le contenu est > à 34, et
qui sont fils de noeud famille fils du noeud racine dont l'attribut
type vaut "non métal".
- /famille/atome[3] [masse >
34] sélectionne parmi les 3ème éléments
atome des fils famille du noeud racine ceux dont la masse est
> à 34
- /famille/atome[masse > 34]
[3] sélectionne le 3ème élément
parmi les atomes, dont la masse est > à 34, des fils
famille du noeud racine
- /famille[count(atome[masse
> 34]) != 0] sélectionne les noeuds famille du
noeud racine ayant au moins un fils atome de masse > à
34
- /famille[not(contains(@type, 'gaz'))]
sélectionne les noeuds famille du noeud racine ayant un
attribut type qui ne comporte pas la chaine 'gaz'
- opérateurs : and, or, *,
+, -, /, mod
- fonctions numériques : number,
sum, floor, ceiling, round
- fonctions booléennes : not,
lang
- fonctions sur les noeuds :
- id("chaine")
le noeud dont l'identifiant unique est chaine
- name(noeud) renvoi le
nom du noeud avec namespace
s'il y a
- local-name(noeud) renvoi
le nom du noeud sans préfixe (namespace)
- fonctions chaines :
- string(objet) convertit
l'objet en chaine
- contains(chaine, sous-chaine) renvoie
un boolean
- string-length(chaine)
renvoie un nombre
- substring
- ...