Découverte de XSLT
Par neolao, jeudi 2 mars 2006 à 23:13 :: Divers
:: #17
::
Après un petit rassemblement sympa entre bloggeur geek hier, j'ai retenu qu'il fallait que j'regarde un peu le XSLT. J'ai survolé et fait des tests rapides en quelques heures, mais c'est largement suffisant pour se faire une idée de la chose. Merci NiKo pour nous avoir pris la tête avec ça
.
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
Trackbacks
Pour faire un trackback sur ce billet :
http://blog.neolao.com/tb.php?id=17
Commentaires
Par Thanh, jeudi 2 mars 2006 à 23:44
Rhôooooo la réputation que tu me fais ^^
Par NiKo, vendredi 3 mars 2006 à 08:52
Thanh++ ^^
Après, en PHP tu peux aussi utiliser XSLT :
<?php
$xslt = xslt_create();
xslt_set_base ($xslt, 'file://'.getcwd ().'/');
echo xslt_process($xslt, 'bioman.xml', 'bioman.xsl');
?>
Par neolao, vendredi 3 mars 2006 à 09:25
j'ai essayé en local, il connait pas la fonction xslt_create, j'ai pas cherché à comprendre
Par remouk, mardi 7 mars 2006 à 15:22
N'ayant jamais pris le temps de regarder le XSLT non plus, je trouve ce billet très bien venu, et franchement bien écrit. Et c'est pareil pour le reste du blog. 
Alors vous me ferez le plaisir de continuer, Môôsieur !
Par Olivier, mercredi 29 mars 2006 à 01:38
Bienvenue chez les fous
Une chose à ne jamais oublier avec XSLT : ce n'est pas un langage de programmation. J'entends par là que les variables n'en sont pas vraiment (on ne peut pas les changer), que les if n'ont pas de else et quelques gourmandises du même style. Pour bien avancer, toujours voir le template non pas comme une fonction mais comme un événement.
Si vraiment le sujet te branche, je conseille habituellement deux livres :
XML: langage et applications, de Alain Michard (Eyrolles, ISBN 2-212-09206-7), il y a un bon chapitre pas trop long sur XSLT et plein de choses sur XML, ça fait pas de mal.
XSLT fondamental, de Philippe Drix (Eyrolles, ISBN 2-212-11082-0). Sûrement le meilleur livre sur XSLT, un gros pavé très complet, tout y est, y compris les trucs les plus tordus. L'annexe où l'auteur explique comment il a transformé en RTF son livre écrit en XML, avec... XSLT est un grand moment :D
En ligne, la meilleure ressource est XSLT FAQ:
www.dpawson.co.uk/xsl/sec...
Je vais arrêter de poluer ton blog pour ce soir 
Par neolao, mercredi 29 mars 2006 à 09:22
ouais, faut voir le XSLT comme un outil de conversion, pas un moyen de programmer quelque chose
mais pour convertir, il faut du matériel
pour avoir un else, on utilise plus le if, mais le choose il me semble
en survolant la doc, j'ai vu plein de choses, surtout sur le XSLT 2.0
Par TiBlond, mercredi 29 mars 2006 à 17:22
Et avec une surcouche de CSS l'XSTL c'est encore mieux 
Par mEga, vendredi 31 mars 2006 à 01:56
Je me crois au boulot c'est di,gue ça ^^
J'ai la tête dans xslt, xsl-fo, xml toute la journée au travail ^^
@Olivier> tu peux utiliser <xsl:otherwise> a la place d'un if classique ;)ca te donne une structure du style
<xsl:choose>
<xsl:if>blabla</xsl:if>
<xsl:otherwise>reblabla</xsl:otherwise>
</xslchoose>
Par Xavier + Bertrand-T, mercredi 5 avril 2006 à 20:21
> Neolao, ce que te disait Niko au sujet de xslt_create est valable pour php4 (et tu sembles utiliser php5).
Si vous utilisez easyphp (donc php4), il faut avoir Sablotron (moteur xslt basé sur la bibliothèque expat) d'activé (décommenter dans le fichier php.ini (dans le répertoire conf_files ou apache (mais dans un seul, pas les deux, sinon, trucs bizarres) la ligne ";extension=php_xslt.dll" (en virant le point-virgule du début)). Ensuite, en faisant un phpinfo(); doit apparaître
"xslt
XSLT support enabled
Backend Sablotron
Sablotron Version 1.0"
Mieux vaut utiliser une version récente d'easyphp (sinon il faut aller trifouiller dans windows\system32, etc.), ou encore mieux : installer xampp (qui fait du 4 et du 5 sur plusieurs systèmes d'exploitation : www.framasoft.net/article... ).
Exemple en php5 :
<?php
// charger les fichiers XML et XSL
$xml = new DOMDocument;
$xml->load('ton_document.xml');
$xsl = new DOMDocument;
$xsl->load('ton_document.xsl');
// instancier le moteur XSLT
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl); // indication au moteur de la feuille XSL utilisée
echo $proc->transformToXML($xml); // afficher le résultat de la transformation
?>
Et pour les irréductibles de php4 :
<?php
#on crée un moteur XSLT
$xh = xslt_create();
/*
on ouvre le document XML en lecture ;
on lit le document à condition qu'il n'excède pas 1000000 de caractères (sinon cela provoquera une erreur ; la valeur peut être changée).
*/
$file=fopen("ton_document.xml","r");
$xml=fread($file,1000000);
fclose($file);
$file=fopen("ton_document.xsl","r");
$xsl=fread($file,1000000);
fclose($file);
$mesDocuments = array(
'/_xml' => $xml,
'/_xsl' => $xsl
);
/*
s'il y a des paramètres à passer au moteur pour la feuille de style XSL
exemple :: <xsl:param name="monParametre1"/>
Vous remarquerez la similitude entre le nom du paramètre côté PHP et côté XSL,
sinon ça ne marche tout simplement pas
*/
$parameters=array(
'monParametre1'=>"valeurMonParametre1",
'monParametre2'=>"valeurMonParametre2",
'monParametreEtc'=>"valeurMonParametreEtc"
);
#on effectue la transformation
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $mesDocuments, $parameters);
/*
si la transformation a raté, xslt_process renvoie un boolean valant false,
sinon xslt_process renvoie le résultat de la transformation
*/
#si la transformation a raté
if($result==false)#pour les fans de raccourcis d'écriture : if(!$result)
echo "erreur de transformation";
#si la transformation a reussi on affiche le résultat
else
echo $result;
/*
A la fin, on libère la mémoire du moteur (utile quand on exécute ce code en début de script), sinon, de toute manière, cela sera fait à la fin du script.
*/
xslt_free($xh);
?>
Par kwa, dimanche 18 juin 2006 à 03:06
Il y a quelques années, j'avais réussi à faire introduire le XML comme format de données logiques dans une équipe de développement de jeux vidéo. Ainsi, la position des bonshommes dans le jeu, l'IA, étaient des informations pratiques à éditer à la main, le temps que l'outil d'édition soit fonctionnel.
Cette petite introduction au XSLT nous aurait alors permis de nous y mettre plus aisément, le temps manquant, nous avons dû nous contenter d'un simple affichage texte, en attendant la disponibilité des outils d'édition (beaucoup plus pratiques et intuitifs, mais pas disponibles dès le début), pour identifier les erreurs.
Bravo, très bonne présentation, donc !