Introduction à XSLTDate de publication : 16/09/2003 , Date de mise a jour : 06/07/2005
Par
Victor Stinner (home)
Tutoriel d'introduction pour XSLT (eXtensible Stylesheet Language Transformation). I. Introduction II. Exemple II.A. Documents et codes II.B. Résultat attendu II.C. Explication II.D. Trions le résultat III. Recopier balises et textes III.A. Code naïf III.B. Problème et solution IV. Problèmes courants IV.A. Eviter un peu la lourdeur du XSLT grâce aux accolades IV.B. Supprimer les espaces dûs à l'indentation XML IV.C. Supprimer les espaces dûs à l'indentation XSLT V. Conclusion I. Introduction
XSLT est l'abréviation de Extensible Stylesheet Language Transformation. C'est un langage de programmation qui sert à transformer des documents XML dans divers formats comme le HTML et ... le XML :-)
XSLT possède de nombreuses fonctions de traitement qui en font un langage de programmation complet. On peut créer des "fonctions", des boucles, calculer un maximum, faire des recherches dans un document XML, compter le nombre de résultats, etc. Mais XSLT est avant tout orienté vers le traitement d'un fichier XML. On va appliquer des modèles (templates) sur les balises XML, puis leur appliquer des traitements divers.
Cet article est une introduction à XSLT, pour les fonctions plus "avancées", voyez mon article Programmer en XSLT.
II. ExempleII.A. Documents et codes
Documents XML source (liste.xml) :
Feuille de style XSLT (xslt.xsl) :
En PHP, vous pouvez utiliser ce script :
II.B. Résultat attendu
Vous devriez obtenir le résultat suivant :
En code HTML, ça donne :
II.C. Explication
Reprenons le code XSLT en détail. Déjà, on peut constater qu'une feuille XSLT est écrite en ... XML ;-)
II.D. Trions le résultat
Cet exemple n'est pas très utile. Alors rendons le plus attractif en triant le résultat. Il suffit de changer deux lignes de code ! Il suffit de remplacer :
par
Résultat :
Ca marche ... Mais ce n'est pas ce qu'on veut. Les nombres sont triés caractères par caractères (0, 1, 3, 6 : ils sont dans l'ordre). Il faut alors corriger en spécifiant le type des données : on a des nombres !
Et voilà le travail ;-) Trop facile ... Plus fort, on peut inverser la liste en ajoutant l'attribut order="descending" (ordre décroissant) à la balise sort.
Alors, vous commencez à percevoir l'intérêt de XML et XSLT ?
III. Recopier balises et textesIII.A. Code naïf
Si vous ne voulez pas écrire un modèle pour toutes les balises, il faudra tôt au tard écrire deux modèles génériques : un pour les attributs, un autre pour les balises. Ce qui nous donne :
III.B. Problème et solution
Si vous utilisez le code donné plus haut, vous aurez des problèmes de namespace (espace de nom) avec des balises qui ressemblent à ça :
Ceci est du au fait que la balise xsl:copy copie également l'espace de nom du moteur XSLT ... Solution :
IV. Problèmes courantsIV.A. Eviter un peu la lourdeur du XSLT grâce aux accolades
Quand j'ai écrit mes premières pages XSLT, j'écrivais très proprement mes balises :
Je sais pas ce que vous en dites, mais perso, je trouve ça très lourd juste pour écrire un lien ! La solution : les accolades. Ces dernières dans la valeur d'un attribut remplacent un xsl:value-of. Exemple équivalent à l'exemple ci-dessus :
C'est plus court, nan ? On peut faire beaucoup de chose dans des accolades, mais pas tout bien sûr (pas de xsl:if par exemple). On peut par exemple utiliser la concaténation : href="{concat($repertoire,'/',$nomfich)}". Je n'ai pas poussé les tests trop loin, mais je pense que toutes les fonctions XPATH y sont utilisables ;-)
IV.B. Supprimer les espaces dûs à l'indentation XML
Quand j'écris un document XML, j'aime bien indenter mon code pour avoir une bonne lisibilité. Mais le problème est que dans certains cas, on aimerait bien supprimer ces espaces ! Exemple tout bête :
Sans aucune modification, le code HTML généré sera (indentation XSLT activée) :
Ce n'est pas très joli :-/ Il existe alors deux commandes XSLT pour remédier à ce problèmes :
"strip-space" va supprimer les espaces inutiles de toutes les balises. Mais les balises HTML pre et code doivent conserver leur indentation, on les écrit alors dans la commande XSLT "preserve-space" (on sépare les balises par le caractère '|'). Par défaut, tous les espaces sont conservés.
IV.C. Supprimer les espaces dûs à l'indentation XSLT
De la même manière qu'en XML, j'aime bien indenter mon code XSLT. Exemple :
Le problème est que la sortie donne quelque chose ressemblant à :
La solution : utiliser la balises XSLT "xsl:text". Cette balise permet d'écrire proprement du texte à l'intérieur d'une balise. L'idéal serait de n'utiliser que cette balise, mais en pratique on ne l'utilise que lorsqu'elle est vraiment nécessaire (pas folle l'abeille !). Ce qui donne le code XSLT final :
V. Conclusion
Nous avons fait un tour rapide de XSLT, et de quelques problèmes courants rencontrés. Vous avez pu voir comment ça marche, et vous avez pu apercevoir la puissance de XSLT. Mais lisez vite mon article Programmer en XSLT pour voir ce que XSLT a vraiment dans le ventre ;-)
|
Copyright © 2005 Victor STINNER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.