Un document XML a une forme arborescente. Pour sélectionner l'élément <title> qui se trouve dans un document XHTML, voici un chemin XPath: /html/head/title
. Si cela vous fait penser à une arborescence de fichier Unix, c'est parce que l'on a aussi une arborescence dans le système de fichiers. L'analogie peut encore être poussée un peu plus loin, car suivant l'endroit où l'on est dans l'arborescence, on peut sélectionner un bout de XML simplement avec son nom, comme title
, ou même avec un chemin relatif head/title
. Mais l'analogie s'arrête là.
Nous avons vu comment sélectionner un élément. Pour sélectionner son contenu, il faut utiliser une localisation spéciale: text(). De la même manière, pour un commentaire, c'est comment() et pour une instruction de traitement processing-instruction(). Pour récupérer le texte du titre et non pas l'élément <title>, voici quelques exemples: /html/head/title/text()
ou title/text()
ou ... Pour les commentaires, le code suivant remplace tout commentaire par le commentaire comme quoi le précédent commentaire a été supprimé:
1 <xsl:template match="comment()"> 2 <xsl:comment>Commentaire supprimé</xsl:comment> 3 </xsl:template>
Pour sélectionner un attribut, par exemple la taille du bord d'un tableau défini par <table border="0">, il faut faire précéder le nom de l'attribut par un @. Cela donne dans ce cas: table/@border
qui doit contenir 0.
Toujours pour l'exemple précédent, et en guise d'illustration, nous pouvons rajouter une légende indiquant la taille du bord:
1 <xsl:template match="table"> 2 <!-- copier ici la table ou en faire ce qu'on veut --> 3 La taille de la bordure de la table est <xsl:value-of select="@border"/> 4 </xsl:template>
Il existe plusieurs manières d'effectuer une sélection multiple. L'une est d'utiliser le symbole | comme dans les expressions rationnelles. Pour sélectionner n'importe quel sous-titre XHTML par exemple, utilisez h1|h2|h3|h4|h5|h6
. Mais il existe aussi des jokers, un peu comme le point et l'étoile des expressions rationnelles. N'importe quel noeud d'élément, peu importe son nom, se sélectionne avec l'étoile. Ainsi, /html/body/*
sélectionnera tous les noeuds fils du noeud body dans l'arborescence d'un document XHTML. Cependant, l'étoile ne sélectionne que les noeuds d'éléments. Pour sélectionner n'importe quel noeud d'attribut, il faut utiliser @*
. Et s'il s'agit de sélectionner n'importe quel noeud, qu'il soit d'élément, d'attribut, de texte, de commentaire... de n'importe quel noeud, utilisez node()
.
Explication du chemin @*|node()
que l'on rencontre souvent: nous sommes en train de traiter le noeud courant. Si nous sélectionnons juste node()
, nous aurons tous les noeuds, attributs compris, mais fils. Nous n'aurons pas les attributs du noeud courant. C'est pour cela que nous ajoutons @*
pour sélectionner aussi les attributs du noeud courant.
Enfin, pour créer un chemin, nous avons vu / dont la signification est triviale. Mais il y a aussi . et .. dont la signification est triviale aussi: le noeud courant pour le point, et le noeud parent pour le double point. Par contre // est moins trivial! Cela permet de sélectionner parmi tous les déscendants, pas uniquement les fils du noeud qui précède le double slash. Dans un exemple précédent, nous sélectionnions tous les noeuds fils du noeud body avec /html/body/*
. Pour sélectionner non seulement les noeuds fils, mais les fils des fils et ainsi de suite, voici le chemin: /html/body//*
.
© 2003 Yves Mettier