- Tous les cours
- Conditions d'utilisation
- À propos de ces cours
- Contact

# Cours de XML - Fonctions XPath

version 1.31, dernière mise à jour le 22 janvier 2008.

Chercher dans le cours :

## Table des matières (TdM)

1. I. Introduction

1. II. Fonctions XPath applicables aux nœuds
   1. Fonction de comptage : la fonction count()
   2. Obtenir la position d'un nœud : les fonctions position() et last()
      1. Introduction
      2. La fonction position()
      3. La fonction last()

1. III. Fonctions XPath applicables aux chaînes de caractères
   1. Concaténation de chaînes avec la fonction concat()
   2. Test de présence d'une sous-chaîne : les fonctions contains() et starts-with()
   3. Extraction de sous-chaîne
   4. Transformation des caractères d'une chaîne : la fonction translate()
   5. Suppression des espaces en surnombre : la fonction normalize-space()
   6. Longueur d'une chaîne: la fonction string-length()

1. IV. Fonctions XPath applicables aux nombres
   1. Rappel : opérateurs disponibles
   2. Fonctions de manipulation

1. V. Fonctions booléennes
   1. Fonctions booléennes constantes : true() et false()
   2. La fonction not()
   3. Test de la langue : la fonction lang()
   4. Conversion à un booléen : la fonction boolean()
   5. Exercice : Utilisation des fonctions XPath

1. VI. Autres fonctions
   1. Accéder à un autre document avec document()
      1. Introduction
      2. Exemple

Retour au menu

## Contenu du cours

### I. Introduction

Nous avons vu dans un chapitre précédent que les transformations XSLT font appel à une syntaxe particulière, nommée XPath, pour identifier les nœuds que l'on souhaite manipuler. Ce chapitre va donner quelques fonctions utiles.

### II. Fonctions XPath applicables aux nœuds

#### 1. Fonction de comptage : la fonction count()

La fonction `count(ensemble_de_nœuds)` permet de compter le nombre de nœuds référencés. Par exemple, si dans un fichier `XML` on déclare la liste des 8 planètes du système solaire sous la forme de balises `planete`, l'instruction `count(//planete)` renverra la valeur 8.

>Retour à la TdM

#### 2. Obtenir la position d'un nœud : les fonctions position() et last()

##### a. Introduction

Ces fonctions permettent de connaître la position d'un nœud par rapport à ses frères.

>Retour à la TdM

##### b. La fonction position()

La fonction `position()` retourne la position du nœud contextuel. Sur l'exemple de système solaire, si on a classé les planètes par ordre de distance croissante au Soleil dans le fichier `XML`, le code `<xsl:value-of select="planete[position()=3]/nom"/>` renvoie la valeur "Terre" (la troisième planète à partir du Soleil).

>Retour à la TdM

##### c. La fonction last()

La fonction `last()` permet de retourner le dernier nœud d'un ensemble de nœuds, c'est-à-dire la position du dernier nœud. Ainsi, le code `<xsl:value-of select="planete[position()=last()]/nom"/>` retourne la valeur "Neptune" (planète la plus éloignée du Soleil).

>Retour à la TdM

### III. Fonctions XPath applicables aux chaînes de caractères

#### 1. Concaténation de chaînes avec la fonction concat()

La fonction `concat()` concatène toutes les chaînes qui lui sont passées en arguments et retourne la chaîne résultant de cette concaténation. Sa syntaxe est `concat(chaine1, chaine2, ...)`. Par exemple, `<xsl:value-of select concat('Le livre dont le titre est', livre/titre, ' a été écrit par ', livre/auteur)/>` permet ainsi d'afficher la chaîne "Le livre dont le titre est Les Misérables a été écrit par Victor Hugo".

>Retour à la TdM

#### 2. Test de présence d'une sous-chaîne : les fonctions contains() et starts-with()

Ces fonctions permettent de déterminer si une chaîne de caractères est incluse dans une autre, et renvoient un booléen. La fonction `starts-with(chaine1, chaine2)` renvoie la valeur `true` si `chaine1` commence par la `chaine2`, `false` sinon. La fonction `contains(chaine1, chaine2)` renvoie `true` si `chaine1` contient `chaine2`, `false` sinon.

>Retour à la TdM

#### 3. Extraction de sous-chaîne

Il existe trois fonctions permettant d'extraire une sous-chaîne d'une chaîne donnée : `substring()`, `substring-after()` et `substring-before`.

1. La fonction `substring(chaine1, decalage, longueur)` retourne une sous-chaîne de `chaine1` contenant `longueur` caractères et commençant à `decalage`. Par exemple, `substring("012345", 2, 3)` renvoie la chaîne "123" ;

2. La fonction `substring-after(chaine1, chaine2)` retourne la sous-chaîne de `chaine1` qui suit la première occurence de `chaine2`. Par exemple, `substring-after("012345", "2")` renvoie la chaîne "345" ;

3. La fonction `substring-before(chaine1, chaine2)` retourne la sous-chaîne de `chaine1` qui précède la première occurence de `chaine2`. Par exemple, `substring-before("012345", "2")` renvoie la chaîne "01".

>Retour à la TdM

#### 4. Transformation des caractères d'une chaîne : la fonction translate()

La fonction `translate(chaine1, chaine2, chaine3)` retourne `chaine1` après y avoir remplacé chaque occurence des caractères de `chaine2` par le caractère correspondant (c'est-à-dire occupant la même position) de `chaine3`. Par exemple, pour transformer une lettre quelconque et la mettre en majuscule, on utilise l'appel suivant de la fonction : `translate(chaine, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")`.

>Retour à la TdM

#### 5. Suppression des espaces en surnombre : la fonction normalize-space()

Il est parfois nécessaire de supprimer des espaces en surnombre dans une chaîne. La fonction `normalize-space(chaine)` retourne la chaîne de caractères qu'elle reçoit en argument après en avoir supprimé les espaces situés au début et à la fin, et y avoir remplacé chaque séquence d'espaces consécutifs par un espace unique.

>Retour à la TdM

#### 6. Longueur d'une chaîne: la fonction string-length()

Cette fonction retourne "classiquement" la longueur de la chaîne qu'elle reçoit en argument.

>Retour à la TdM

### IV. Fonctions XPath applicables aux nombres

#### 1. Rappel : opérateurs disponibles

Les opérateurs suivants sont disponibles en XSLT :

- `+` pour l'addition ;

- `-` pour la soustraction ;

- `*` pour la multiplication ;

- `div` pour la division ;

- `nombre1 mod nombre2` retourne le reste de la division euclidienne du premier nombre par le second.

>Retour à la TdM

#### 2. Fonctions de manipulation

Ces fonctions sont peu nombreuses, et nous les avons déjà rencontrées dans le chapitre sur XSLT :

- La fonction `ceiling(nombre)` retourne le plus petit entier égal ou supérieur au nombre qu'elle reçoit en argument ;

- La fonction `floor(nombre)` retourne le plus grand entier égal ou inférieur au nombre qu'elle reçoit en argument ;

- La fonction `round(nombre)` arrondit le nombre qu'elle reçoit à l'entier le plus proche.

- La fonction `sum(nombre1, nombre2, ...)` retourne la somme des nombres reçus en argument. Cette fonction sert aussi à calculer la somme des éléments spécifiés par une expression `XPAth` : par exemple, `sum(//prix)` calcule la somme des contenus de tous les éléments `prix` du document `XML`.

>Retour à la TdM

### V. Fonctions booléennes

#### 1. Fonctions booléennes constantes : true() et false()

Il est parfois nécessaire de créer une constante booléenne initialisée à une valeur `true` ou `false`. Cette opération est réalisable par un appel respectivement aux fonctions `true()` et `false()`.

>Retour à la TdM

#### 2. La fonction not()

La fonction `not(variable)` retourne l'inverse de la valeur logique de son argument.

>Retour à la TdM

#### 3. Test de la langue : la fonction lang()

La fonction `lang(chaine)` vérifie que la langue dans laquelle est écrit le nœud courant (telle qu'elle est définie par l'attribut `xml:lang`) est la même que le langage qu'elle reçoit en argument. Cette fonction reçoit une chaîne correspondant à l'un des codes de langage définis dans la spécification XML : `en` pour l'anglais, `jp` pour le japonais, `fr` pour le français, etc. Cela permet, avec une même feuille de style, de gérer des fichiers `XML` écrits dans des langues différentes.

>Retour à la TdM

#### 4. Conversion à un booléen : la fonction boolean()

La fonction `boolean(objet)` convertit son argument en valeur booléenne. Le comportement de cette fonction dépend du type XPath de son argument :

- Si l'argument est un nombre non nul et différent de `NaN`, la fonction retourne `true` ; si l'argument est égal à zéro ou `NaN`, la fonction retourne `false` ;

- Si l'argument est une chaîne non vide, le résultat est `true` ; sinon, le résultat est `false` ;

- Si l'argument est de type booléen, sa valeur reste identique ;

- Si l'argument est un ensemble de nœuds, le résultat est `true` sauf si l'ensemble de nœuds est vide (dans ce cas, la valeur est `false)`

>Retour à la TdM

#### Exercice 1. Utilisation des fonctions XPath

##### Énoncé

##### Correction

### VI. Autres fonctions

#### 1. Accéder à un autre document avec document()

##### a. Introduction

Il est parfois nécessaire d'accéder à un document extérieur au fichier `XML` en cours de transformation, pour y récupérer une information particulière. XPath le permet grâce à la fonction `document(chaine)`. Cette fonction prend comme argument une chaîne de caractères donnant le chemin vers le fichier à ouvrir. Il faut ensuite spécifier le chemin vers l'élément cherché, à partir de la racine.

>Retour à la TdM

##### b. Exemple

Supposons que nous soyons en train de transformer un fichier `biblio.xml`, contenant une liste de livres, pour lesquels on donne un auteur :

<biblio>
<livre>(...)</livre>
<livre>(...)</livre>
<livre>
<titre>Les Misérables</titre>
<auteur prénom="Victor" nom="Hugo" />
</livre>
</biblio>

En parallèle, on dispose d'un fichier `auteurs.xml` possédant des références biographiques sur des auteurs, dont Victor Hugo :

<biographies>
<auteur>(...)</auteur>
<auteur>(...)</auteur>
<auteur prénom="Victor" nomFamille="Hugo">
<naissance><date>1802</date>(...)</naissance>
<décès><date>1885</date>(...)</décès>
<biographie>(...)</biographie>
</auteur>
</biographies>

Lors de la transformation du fichier `biblio.xml`, on peut accéder à ces informations avec la commande suivante :

<xsl:variable name="nomAuteur" select="@nom" />
<xsl:variable name="prénomAuteur" select="@prénom" />
<xsl:value-of select="document('auteurs.xml')//auteur[@prénom=$prénomAuteur and @nomFamille=$nomAuteur]/naissance/date" />
<xsl:value-of select="document('auteurs.xml')//auteur[@prénom=$prénomAuteur and @nomFamille=$nomAuteur]/décès/date" />

>Retour à la TdM

## Historique de ce document

- Le 22 janvier 2008, version 1.31. Corrections de fautes de frappe et de syntaxe.
- Le 1er décembre 2005, version 1.30. Ajout d'une introduction, d'une section sur la fonction document(), corrections typographiques et syntaxiques.
- Le 13 juillet 2005, version 1.20. Réécriture des exemples.
- Le 16 juin 2004, version 1.11. Ajout des corrections des exercices.
- Le 9 février 2004, version 1.10. Corrections typographiques, complément d'explication sur la fonction sum() et ajout d'un exercice.
- Le 28 novembre 2003, version 1.00. Création du cours

## Bibliographie

### De l'auteur (G. Chagnon)

- XML, publié par Pearson Education en septembre 2007. Livre de cours et exercices écrit en collaboration avec Florent Nolot (Université de Reims). Consulter la fiche sur Eyrolles. Consulter la fiche sur Amazon.

## Conditions d'utilisation et licence

Cette création est mise à disposition par Gilles Chagnon sous un contrat Creative Commons.

Retour au menu