XSL - XPath

Définition

Xpath (XML Path Language) est un langage servant à adresser des parties d'un document XML grâce à une syntaxe standard. A l'instar de XSLT et XSL-FO, Xpath fait parti de la famille XSL.

Défini par le W3C, il fût créé à l'origine pour bénéficier d'une syntaxe et d'un comportement standard entre Xpointer et XSLT, mais devint rapidement un élément de nombreuses autres recommandations W3C.

A ce jour (février 2012), Xpath existe en deux versions : la 1.0 du 16 novembre 1999 et la version 2.0 du 23 Janvier 2007. Encore une fois, le W3C recommande de reconnaître les deux versions, même si la première reste la plus utilisée à l'heure actuelle.




Syntaxe de base

Xpath est donc un langage permettant d'adresser certaines parties d'un document XML comme un noeud, une liste de noeud ou encore une liste d'attribut grâce à des « expressions ». Xpath a été concu pour que les « expressions » simples ressemblent à un chemin dans un système de fichier UNIX. Ainsi, la syntaxe de base de Xpath se décrit comme suit :

Expression Parties adressées
/balise Tous les noeuds "balise" enfants du noeud racine (chemin absolu)
balise Tous les noeuds "balise" enfants du noeud courant (chemin relatif)
//balise Tous les noeuds "balise" du document
. Le noeud courant
.. Le noeud parent du noeud courant
@attr L'attribut "attr" du noeud courant
balise[pred] Tous les noeuds "balise" respectant le prédicat "pred"
* Tous les noeuds

On peut donc voir par exemple, qu'une expression comme:
/bibliothèque/livre/auteur/@nom
ressemble fortement à un chemin absolu d'un système de fichier et permet de récupérer l'attribut "nom" d'un élément "auteur", fils d'un élément "livre" lui même fils d'un élément "bibliothèque" situé à la racine.




Axes de recherche

Afin de créer des expressions plus complexe et permettre de rechercher des éléments sans connaître l'architecture exacte du fichier XML, le langage Xpath proprose également des « axes de recherches ». Ces axes permettent d'orienter la recherche dans une direction en ne sélectionnant qu'une partie des éléments. En voici une liste non exhaustive :

Axes Description
ancestor Tous les ancêtres du noeud courant
ancestor-or-self Tous les ancêtres du noeud courant + le noeud courant
attribute Tous les attributs du noeud courant
descendant Tous les descendants du noeud courant
descendant-or-self Tous les descendants du noeud courant + le noeud courant
following Tous les noeuds du document venant après le noeud courant
following-sibling Tous les "frères" du noeud courant situés après celui-ci
parent Le parent du noeud courant
preceding Tous les noeuds du document venant avant le noeud courant
preceding-sibling Tous les frères du noeud courant situés avant celui-ci

Xpath permet donc d'écrire des expressions du type :
ancestor::livre
qui permettent par exemple ici de rechercher un élément livre mais uniquement parmis les parents du noeud courant.




Fonctions

Enfin, le langage Xpath défini également un certain nombre de fonction permettant d'effectuer des opérations sur les données. Par exemple :

Fonction Description
sum(nombre1, nombre2 ...) Calcule la somme de ses arguments. Par exemple sum(livre/@prix) calculera la somme des valeurs des attributs "prix" des éléments "livre"
count(expression) Renvoie le nombre de noeud concernés par l'expression XPath fournie en argument. Par exemple count(livre) renverra le nombre d'élément "livre" enfant du noeud courant
last(expression) Renvoie le dernier élément d'une liste de noeud. last(livre) renverra le dernier élément "livre" enfant du noeud courant.
contains(chaine1,chaine2) Renvoie "true" si la première chaine contient la seconde. La fonction renvoie "false" dans le cas contraire
starts-with(chaine1,chaine2) Renvoie la valeur "tru" si la première chaine fournie en argument commence par la seconde. Sinon, la fonction "false"

Il existe de nombreuses autres fonction XPath. Celle-ci sont extrèmement utiles, pour "trier" les résultats d'un expression par exemple.




Une expression XPath complète

Pour résumer, une "expression" XPath est un enchainement de "pas de localisation", séparés par des barres obliques (/). Un pas de localisation est de la forme :

axe::balise[prédicat]

où l'axe et le prédicat son optionnels.

Exemples

Finalement, la richesse du langage Xpath nous permet donc d'adresser directement n'importe quelles parties d'un document XML, aussi précises soient-elles. Les quelques exemples suivants permettent de se rendre compte des possibilitées offertes par le langage :

Expression Parties adressées
bibliothèque/livre Tous les éléments "livre", enfants de l'élément "bibliothèque"
bibliothèque/*/auteur Tous les éléments "auteur" petits-enfants de "bibliothèque"
*[@attr] Tous les éléments possédant l'attribut "attr"
livre[/bibliothèque/@thème = @genre] Tous les éléments "livre" ayant l'attribut "genre" égal à l'attribut "thème" de l'élément "bibliothèque" situé à la racine
livre[auteur][2] Le deuxième élément "livre" possédant un enfant "auteur"
ancestor::auteur[parent::livre][3] Le troisième ancêtre "auteur" le plus proche du noeud courant qui est parent d'un élément "livre"
livre[count(auteur[(nom or prenom) and nationalité])>1] Tous les "livre" possédant au moins 2 éléments "auteur" pour lesquels existent l'élément "nom" ou "prenom" et l'élément "nationalité"