version 1.32, dernière mise à jour le 15 février 2011.
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.
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.
Ces fonctions permettent de connaître la position d'un nœud par rapport à ses frères.
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).
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).
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".
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.
Il existe trois fonctions permettant d'extraire une sous-chaîne d'une chaîne donnée : substring()
, substring-after()
et substring-before
.
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" ;
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" ;
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".
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")
.
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.
Cette fonction retourne "classiquement" la longueur de la chaîne qu'elle reçoit en argument.
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.
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
.
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()
.
La fonction not(variable)
retourne l'inverse de la valeur logique de son argument.
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.
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)
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.
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>
On peut obtenir, lors de la transformation du document biblio.xml
, le prénom du troisième auteur du document auteurs.xml
en tapant par exemple <xsl:value-of select="document(’auteurs.xml’)//auteur[3]/@prénom"
.
Lors de la transformation du fichier biblio.xml
, on peut aussi recourir à des commandes plus complexes :
<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" />
Cette création est mise à disposition par Gilles Chagnon sous un contrat Creative Commons.