XPath

Introduction à XPath

Le langage XSLT se base sur le langage XPath pour faire réference aux différents noeuds composant un document XML. C'est notamment ce qui est utilisé dans les attributs "match" de la balise "template", "select" de la balise "apply-templates" ou encore "select" de la balise "value-of" (et qui ont été surlignés dans l'exemple suivant).
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1"/>
    <xsl:template match="/">
        <html>
            <head><title>Annuaire</title></head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="annuaire">
        <table border="1">
            <tr><th>Nom</th><th>Prenom</th><th>email</th></tr>
            <xsl:apply-templates/>
        </table>
    </xsl:template>

    <xsl:template match="personne">
        <tr><td><xsl:value-of select="@type"/>: <xsl:value-of select="nom"/></td>
            <td><xsl:value-of select="prenom"/></td>
            <td><xsl:value-of select="email"/></td></tr>
    </xsl:template>
</xsl:stylesheet>


Les bases d'XPath

Dans les exemples vus jusque là, l'utilisation de XPath c'est généralement limité à préciser "." (le noeud courant), un nom de balise (un sous-noeud) ou encore "@attribut" (l'attribut du noeud courant). En fait, il est possible de faire référence à n'importe qu'elle autre noeud en utilisant une notation toute simple (comme celle que l'on utilise pour faire référence à un fichier).
  1. / indique le noeud racine
  2. . indique le noeud courant
  3. .. indique le noeud parent
Ainsi
  1. /niveau1 indique le noeud appelé "niveau1" sous le noeud racine
  2. ./ssniveau indique le noeud appelé "ssniveau" sous le noeud courant
Comme vous l'avez compris, c'est le caractère '/' qui sert de délimiteur des niveaux d'arborescence. Il faut toutefois noter, qu'il est possible d'indiquer un niveau quelconque d'arborescence en utilisant la notation "//".
Ainsi
  1. .//ssniveau indique un noeud appelé "ssniveau" se trouvant à n'importe quelle profondeur sous le noeud courant.

Chemin conditionnels avec XPath

Introduction

Toutes ces références peuvent être affinées selon le modèle chemin[condition] pour n'obtenir que les noeuds pointé par "chemin" qui répondent à la condition donnée.

Les conditions

Les conditions peuvent s'appuyer sur des fonctions dont
  1. position() qui retourne l'indice du noeud
  2. last() qui retourne l'indice du dernier noeud
sur les valeurs des attributs via
  1. attribute::nomattribut
et les opérateurs
  1. or, and, =, !=, <=, <, >=, >
On peut donc avoir des expressions du genre
  1. ./ssniveau[position()<3] pour avoir les 2 premiers sous niveaux nommé "ssniveau"
  2. /ssracine[position()=last()] pour avoir le dernier élément "ssracine"
  3. ./ssniveau[attribute::nomattribut="nomcherche"] pour avoir ceux ayant nomattribut="nomcherche"
  4. ./[ssniveau or ssniveau2] pour avoir les élément nommés "ssniveau" ou "ssniveau2"
Ce qui peut s'écrire de façon abrégée
  1. /ssracine[last()] pour avoir le dernier élément "ssracine"
  2. ./ssniveau[@nomattribut="nomcherche"] pour avoir ceux ayant nomattribut="nomcherche"

Les conditions sur la nature de l'élément

Il est également possible (notamment pour les attributs match) de selectionner selon le type de l'élément.
Pour cela, nous disposons des fonctions text() s'il s'agit du contenu d'une balise, processing-instruction() s'il s'agit d'une instruction de traitement ou encore comment() s'il s'agit d'un commentaire.

Combiner les conditions

Il est possible d'appliquer le même template pour différents types ou sélections de noeud en précisant les différents conditions séparées par un |.