4 lettres c'est trop long !

Et puis d'abord c'est quoi ce truc qui a l'air compliqué rien qu'en le prononcant ? L'excuse de Thanh pour ne pas découvrir le XSLT c'est qu'il y a 4 lettres dans le sigle, c'est trop long pour lui ... ahem chochotte va :) . Ca veut dire eXtended Stylesheet Language Transformations, un langage de transmutation transformation XML. Le Stylesheet n'a rien à voir avec CSS, on appelle ca une feuille de style quand même. Un XSLT est un XSL.

Les bases

Je suis tombé sur un message de piouPiouM sur le forum Alsacréations qui m'a aidé à assimiler les bases pour des transmutations transformations simples.

Le principe c'est de transmuter transformer un XML en un autre XML à l'aide d'un XML. [1]

Dans un fichier XSLT, on a un ensemble de règles pour transformer comme il faut. Voilà un exemple de XML :

<perso>
	<nom>Jacky</nom>
	<couleur>rouge</couleur>
</perso>

Et le XSL :

<xsl:template match="perso">
	<h1><xsl:value-of select="nom" /></h1>
	<p>Couleur <xsl:value-of select="couleur" /></p>
</xsl:template>

C'est donc la balise template qui représente le modèle, il a l'attribut match pour cibler ce qu'il doit transformer.

Les boucles et le ciblage

On peut aussi faire des boucles. Un autre exemple de XML :

<bioman>
	<perso>
		<nom>Jacky</nom>
		<couleur>rouge</couleur>
		<jap>
			<nom>Shirou Gou</nom>
			<acteur>Ryosuke Sakamoto</acteur>
		</jap>
	</perso>
	<perso>
		<nom>Fred</nom>
		<couleur>verte</couleur>
		<jap>
			<nom>Shingo Takasugi</nom>
			<acteur>Naoto Tada</acteur>
		</jap>
	</perso>
</bioman>

Et le XSL :

<xsl:template match="bioman">
	<h1>Liste des bioman</h1>
	<dl>
	<xsl:for-each select="perso">
		<dt>Force <xsl:value-of select="couleur" /></dt>
		<dd>Interprété par <xsl:value-of select="jap/nom" /></dd>
	</xsl:for-each>
	</dl>
</xsl:template>

Ici, template cible la balise bioman et fait un for-each sur chaque balise perso. On remarque la notation jap/nom pour récupérer une valeur quand elle est plus loin dans la hiérarchie.

Les conditions et les attributs

Il y a une notation plutôt sympa pour cibler les attributs. Par exemple ce XML :

<perso grade="chef">
	<nom>Jacky</nom>
	<couleur>rouge</couleur>
	<jap>
		<nom>Shirou Gou</nom>
		<acteur>Ryosuke Sakamoto</acteur>
	</jap>
</perso>

Et le XSL :

<xsl:for-each select="perso">
	<dt>
		<xsl:if test="@grade = 'chef'">
			<xsl:attribute name="class">stylechef</xsl:attribute>
		</xsl:if>
		<xsl:value-of select="nom" />
	</dt>
</xsl:for-each>

La balise qui permet de faire un if c'est tout simplement la balise XSL <if>. On met la condition dans l'attribut test. Dans cet exemple, on teste l'attribut grade de la balise XML <perso>, on vérifie que la valeur est égale à chef. Si la condition est remplie, on ajoute un attribut à la balise HTML <dt> grace à balise XSL <attribute>.

Pour faire un if ... then ... else il faut utiliser d'autres balises, mais c'est tout aussi simple.

Les variables

On peut même créer des variables et utiliser des fonctions prédéfinies. Par exemple :

<xsl:variable name="liste">liste</xsl:variable>
<xsl:template match="bioman">
	<h1>Liste des bioman (<xsl:number value="count(perso)" format="1"/> au total)</h1>
	<dl class="{$liste}">
		<xsl:for-each select="perso">
			<dt>
				<xsl:number value="position()" format="1. "/>
				<xsl:value-of select="nom" />
			</dt>
			<dd>Couleur <xsl:value-of select="couleur" /></dd>
		</xsl:for-each>
	</dl>
</xsl:template>

Il y a pas mal de fonctions très pratiques comme position et count qui sont bien sûr utilisables dans les conditions.

Conclusion

J'ai survolé rapidement la documentation mais la première impression est plutôt bonne. La syntaxe et le nom des balises sont faciles à assimiler, ca reste du XML. On peut même trier et créer des modèles paramètrables. Apparement on peut aussi ajouter des fonctionnalités avec des extensions, mais je n'ai pas poussé mes recherches jusque là.

En fait, je n'ai regardé que XSLT version 1.0, il y a encore plus de choses dans XSLT 2.0. D'ailleurs, cette dernière version implémente des fonctionnalités qui n'étaient disponibles qu'en extension dans la version 1.0. Très rapidement, dans la 2.0, il y a des traitements par expression régulière, de la manipulation de données avec XQuery, des formatages de dates, et autres bidules sûrement très utiles :) .

Les sources de mes petits tests (transmutation avec PHP) : decouverte-de-xslt.tar.gz

Notes

[1] <détresse>chouette, encore des balises ...</détresse>