I. Introduction▲
XSLT offre de nombreuses fonctions dignes d'un langage de haut-niveau : variables, paramètres, tests, boucles, fonctions, inclusion d'une feuille de style XSLT dans une autre, chargement de plusieurs documents XML dans une même feuille de style XSLT, recherche de balises XML selon de nombreux critères, etc.
Si vous n'avez pas lu mon introduction à XSLT, allez vite la lire sous peine de ne pas comprendre certains passages.
II. II. Fonctions XSLT▲
II-A. Liste des fonctions XSLT▲
Fonction XSLT | Description |
---|---|
xsl:for-each | Boucle |
xsl:if | Si conditionnel |
xsl:choose, xsl:when et xsl:otherwise | Suite de codes conditionnels : instruction switch en C |
xsl:template, xsl:call-template, xsl:param et xsl:with-param | Déclarer et appeler une fonction, avec ou sans paramètre(s). |
xsl:number | Numérotation/compteur |
II-B. Boucles avec xsl:for-each▲
Je vous ai menti (oh le vilain !). En fait, xsl:for-each n'est pas vraiment une boucle comme un for en langage C. Cette fonction va prendre tous les nœuds d'une requête XPATH et va leur appliquer un traitement. Voyons déjà le fichier source :
<liste>
<invite>
Moi</invite>
<invite>
Amélie</invite>
<invite>
Marie</invite>
<invite>
Jérémy</invite>
</liste>
Puis le code XSLT qui va générer une liste HTML :
<ul>
<
xsl
:
for-each>
<li>
<
xsl
:
apply-templates
select
=
"."
/>
</li>
</for-each>
</ul>
II-C. Fonction xsl:if▲
L'instruction xsl:if permet d'exécuter ou non certaines parties du code. Exemple d'utilisation de l'instruction if :
<
xsl
:
if
test
=
"nom == 'Victor'"
>
<
xsl
:
text>
Tient, on dirait mon prénom !</
xsl
:
text>
</
xsl
:
if>
OK, mais où est le xsl:else ? Euh… Désolé, il n'y en a pas. Il faut utiliser xsl:choose.
II-D. Fonction xsl:choose▲
La fonction xsl:choose permet d'exécuter différents codes selon différentes conditions. Exemple d'utilisation de l'instruction choose :
<
xsl
:
choose>
<
xsl
:
when
test
=
"nom = 'Victor'"
>
<
xsl
:
text>
Salut Victor, ça boume ?</
xsl
:
text>
</
xsl
:
when>
<
xsl
:
when
test
=
"nom = 'Pierre'"
>
<
xsl
:
text>
Fait ciseau ... désolé, c'était nul.</
xsl
:
text>
</
xsl
:
when>
<
xsl
:
when
test
=
"nom = 'Pierre'"
>
<
xsl
:
text>
Message impersonnel et froid : Bonjour.</
xsl
:
text>
</
xsl
:
when>
</
xsl
:
choose>
On utilise souvent xsl:choose comme alternative au xsl:if pour disposer de xsl:other (qui remplace xsl:else qui n'existe pas).
II-E. Une fonction sans paramètre (xsl:template et xsl:call-template)▲
Pour déclarer une fonction, on utilise la fonction xsl:template. Exemple :
<
xsl
:
template
name
=
"hello_world"
>
<
xsl
:
text>
Hello World !</
xsl
:
text>
</
xsl
:
template>
On va maintenant appeler notre fonction avec xsl:call-template :
<
xsl
:
call-template
name
=
"hello_world"
/>
C'est tout… ben ouais. En fait, c'est tout bête !
II-F. Une fonction avec paramètres (xsl:param et xsl:with-param)▲
Bon, passons aux choses sérieuses : passons des paramètres à notre fonction. On va par exemple afficher deux nombres… et leur somme. Pour déclarer des paramètres, on utilise xsl:param. Voici le code de la fonction :
<
xsl
:
template
name
=
"affiche_somme"
>
<
xsl
:
param
name
=
"a"
select
=
"0"
/>
<
xsl
:
param
name
=
"b"
select
=
"0"
/>
<
xsl
:
text>
a = </
xsl
:
text>
<
xsl
:
value-of
select
=
"$a"
/>
<
xsl
:
text>
, b = </
xsl
:
text>
<
xsl
:
value-of
select
=
"$b"
/>
<
xsl
:
text>
, et a+b = </
xsl
:
text>
<
xsl
:
value-of
select
=
"$a + $b"
/>
<
xsl
:
text>
.</
xsl
:
text>
</
xsl
:
template>
Lorsqu'on écrit <xsl:param name="a" select="0" /> : 0 est la valeur par défaut du paramètre a. Appelons ce miracle de la programmation, toujours via xsl:call-template :
<
xsl
:
call-template
name
=
"affiche_somme"
>
<
xsl
:
with-param
name
=
"a"
select
=
"173"
/>
<
xsl
:
with-param
name
=
"b"
>
9001</
xsl
:
with-param>
</
xsl
:
call-template>
Vous savez quoi, le pire c'est que ça marche ! On obtient une sortie du style :
a = 173, b = 9001, et a+b = 9174.
III. Bouts de codes utiles▲
III-A. Une vraie boucle▲
Je préfère vous le dire tout de suite : XSLT n'est pas fait pour faire des boucles ! C'est un langage qui utilise des algorithmes récursifs et non pas itératifs. C'est d'ailleurs beaucoup plus propre, mais moins naturel.
Mais des fois, on a quand même besoin de boucles. Et oui, elles ne nous quitteront jamais, nous les programmeurs. Je vous offre donc ce petit bout de code qui pourrait peut-être vous sauver la vie (qui sait ?) :
<
xsl
:
template
name
=
"boucle"
>
<
xsl
:
param
name
=
"debut"
select
=
"0"
/>
<
xsl
:
param
name
=
"fin"
select
=
"0"
/>
<
xsl
:
text>
i = </
xsl
:
text>
<
xsl
:
value-of
select
=
"$debut"
/>
<br/>
<
xsl
:
if
test
=
"$debut < $fin"
>
<
xsl
:
call-template
name
=
"boucle"
>
<
xsl
:
with-param
name
=
"debut"
select
=
"($debut)+1"
/>
<
xsl
:
with-param
name
=
"fin"
select
=
"$fin"
/>
</
xsl
:
call-template>
</
xsl
:
if>
</
xsl
:
template>
Prototype de la fonction : boucle($debut, $fin). Elle va afficher les nombres de $debut à $fin. Que dire de plus ? Ah oui, ce < bizarre. Eh bien c'est qu'on reste en XML, et < ne peut pas s'écrire tel quel. Il faut l'écrire dans sa forme encodée « < ». Voilà tout !
IV. Fonctions XPATH▲
Fonction XPATH | Description |
---|---|
position() | Position d'une balise dans l'arbre XML |
count(xpath) | Compte le nombre d'éléments d'une requête XPATH |
V. Chaîne de caractères (XPATH)▲
V-A. Liste des fonctions▲
Fonction XPATH | Description |
---|---|
concat(a,b,[c,d,...]) | Concaténation de chaînes |
substring(a,debut[,longueur]) | Extrait une partie de la chaîne a |
substring-before(txt,token) | Ce qui précède la sous-chaîne token |
substring-after(txt, token) | Ce qui suit la sous-chaîne token |
string-length(txt) | longueur de la chaîne txt |
translate(txt,avant,apres) | transforme les caractères avant par ceux apres dans la chaîne txt |
V-B. Exemple (1)▲
On va dire que le nœud courant (.) contient mon email : victor.stinner+haypocalc.com (lisez '@' et non '+'). Exemple d'utilisation des fonctions concat, substring-after et substring-before :
<
xsl
:
value-of
select
=
"concat(
substring-before(.,'@'),
' SUR ',
substring-after(.,'@'))"
/>
Ben oui, on peut écrire sur plusieurs lignes si on veut ! Sortie : « victor.stinner SUR haypocalc.com », cool, c'est ce que je cherchais à faire (cacher mon email).
V-C. Exemple (2)▲
Disons que le nœud courant (.) contient le nom d'une image : « bibi_phoque.gif ». On va remplacer l'extension '.gif' par '.png'. Exemple d'utilisation des fonctions substring et length :
<
xsl
:
value-of
select
=
"concat(substring(.,length(.)-4),'.png')"
/>
Bon, la fonction xsl:string-before pourrait être plus adaptée que substring. Sauf… si le nom de l'image comporte un point ! ("bibi.phoque.gif").
VI. Conditions (XPATH)▲
Fonction XPath | Description |
---|---|
true() | Vrai |
false() | Faux |
not(cond) | Contraire de la condition cond |
a & b ou a and b | a et b |
a | b ou a or b | a ou b |
a == b | a égal b ? |
a != b | a différent de b ? |
a < b | a inférieur b ? (lire a < b, mais il faut l'écrire tel quel) |
a <= b | a inférieur ou égal b ? (lire a <= b) |
a > b | a supérieur b ? (lire a > b) |
a >= b | a supérieur ou égal b ? (lire a >= b) |
VII. Mathématiques▲
Fonction XPath | Description |
---|---|
sum(xpath) | Somme des éléments XPath |
floor(n) | Arrondi par défaut |
ceiling(n) | Arrondi par excès |
round(n) | Arrondi à l'entier le plus proche |
a + b | Somme de a et b |
a - b | Différence de a et de b |
a * b | Produit de a et de b |
a div b | Quotient de a par b |
a mod b | Reste dans la division entière de a par b |
-x | Opposé de x |