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é" |