XPath

Un article de Agora2ia.


XPath : le SQL pour XML

En une phrase, XPath est à XML ce que SQL est aux bases de données, à savoir un langage pour écrire des requêtes, mais uniquement de recherche en ce qui concerne XML. Tout comme XSLT, XPath fait l'objet d'une spécification, distincte, du W3C.

Une expression XPath, encore appelée chemin de localisation XPath, est constituée d'une ou plusieurs étapes de localisation XPath, séparées entre elles par le symbole '/'. Chacune de ces étapes de localisation pouvant elle-même être constituée dans l'ordre :

  1. un axe (par défaut l'axe implicite est child), qui permet d'indiquer si l'on remonte vers les parents, ou si l'on s'enfonce vers les enfant, suivi du séparateur ::, suivi de
  2. un test de nœud, qui spécifie un nœud ou un ensemble de nœuds (test portant sur un d'élément, d'attribut, de namespace ou sur un joker), suivi de
  3. zéro à n prédicats, encadrés chacun par [ ], qui ajoutent des restrictions supplémentaires aux chemins.

Le langage XPath peut être utilisé dans sa forme développée ('parent' pour remonter au nœud père), ou abrégée ('..' toujours pour remonter au nœud père). Dans sa forme abrégée, une expression XPath ressemble alors au chemin, au 'path', d'un fichier sur le disque dur de l'ordinateur.

Si l'on représente un document XML et ses balises entrelacées comme un arbre de dépendances, une expression XPath est une énigme pour laquelle l'enquêteur (le processeur XSLT) peut trouver des solutions diverses en qualité et en quantité, mais qui correspondent tout à fait aux indices qu'il a à sa disposition. L'évaluation de l'expression (résolution de l'énigme) peut donner comme résultat, soit une valeur (numérique ou alphanumérique), soit un sous-ensemble des nœuds de l'arbre.

On peut utiliser une expression XPath à divers endroits du code XSL :

  1. Désignation des nœuds auxquels s'applique une règle (comme ci-dessus, pour les règles par défaut) : <xsl:templates select="FILM/TITRE"/>...<xsl:templates> pour définir une règle qui s'applique à toute balise TITRE, fille d'une balise FILM, elle-même fille de la balise sur laquelle on travaille,
  2. Sélection de nœuds auxquels on souhaite appliquer une règle : <xsl:apply-templates select="//CINEMA[VILLE='Montgeron']/SALLE"/> pour propager l'appel de règle à toute balise SALLE fille d'une balise CINEMA dont la balise fille VILLE vaut 'Montgeron', quel que soit l'endroit où se trouve cette balise CINEMA dans le document XML,
  3. Extraction des valeurs : <xsl:value-of select="../SALLE/@NO"/> pour obtenir la valeur de l'attribut NO de toute balise SALLE qui se trouve au même niveau que la balise sur laquelle on travaille,
  4. Prédicats de test : <xsl:if test="$titre='' and TITRE=$titre">...<xsl:if> pour effectuer un traitement que lorsque l'on a une balise TITRE, fille de la balise sur laquelle on travaille, égale au paramètre titre que l'on a et qui ne doit pas être une chaîne vide.

Enfin, pour maîtriser les expressions XPath, il est important de bien distinguer le nœud courant du nœud contextuel. Le nœud courant est celui dans lequel on est quand on commence à lire l'expression XPath, celui qui est à l'origine de cette expression. Le nœud contextuel quant à lui, est la cible, le ou les nœuds résultats successifs.

Pour plus de détails, et notamment la liste exhaustive des symboles et des spécificateurs d'axe, vous pouvez vous reporter au paragraphe intitulé "chemin de localisation ou motifs XPath" du tutoriel Comprendre XSLT.