MA GALAXIE WEB

LETTRE D'INFORMATION

Nom

Courriel (e-mail)


RECHERCHER



Mon blog d'écrivain

RSS

flux RSS
RSS Commentaires

"Poor Lonesome Coder", parce que pendant longtemps j'ai codé seul, sans collégue. Et je m'en allais
dans la lumiére de l'écran couchant, sur mon fidèle Jolly Clavieur, en chantant une chanson... ;-)

Petit essai en XSLT

un exemple de débutant (moi) sur XSLT

Introduction

A la demande d'un ami j'ai essayé de lui faire un exemple simple illustrant l'usage du XSLT.
Le XSLT est un langage de manipulation du XML, permettant de le transformer en HTML/XHTML, en un autre dialecte XML, ou même en PDF si le coeur vous en dit.

Les données

J'ai commencé par faire un fichier décrivant un article simple. Notez que si ce fichier est conforme XML, il obéit à un dialecte que je viens d'inventer, et que cela ne pose aucun problème. XML donne un cadre pour organiser des données, pas plus.

<?xml version="1.0" encoding="ISO-8859-1"?>
<doc>
<titre>Bienvenue</titre>
<texte>Merci de venir me voir!</texte>
</doc>

Globalement, deux balises, titre et texte, marquent deux blocs de nature différente. Puis j'ai pensé rajouter la possibilité de faire un lien entre deux pages.

<?xml version="1.0" encoding="ISO-8859-1"?>
<doc>
<titre>Gloubiboulga</titre>
<texte>La recette du monstre orange.
Voir aussi <lien id="r2">cette recette</lien></texte>
</doc>

Le code XSLT : tranformation!

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>
<xsl:template match="/"><xsl:apply-templates/></xsl:template>
<xsl:template match="doc"><xsl:apply-templates/></xsl:template>
<xsl:template match="titre"><h1><xsl:apply-templates/></h1></xsl:template>
<xsl:template match="texte"><p><xsl:apply-templates/></p></xsl:template>
<xsl:template match="lien"><a href="?doc={@id}"><xsl:apply-templates/></a></xsl:template>
</xsl:stylesheet>

Outre les deux premières lignes qui indique quelle version j'utilise (et donc comment elle devra être lue), étudions ce qui suit

Le XSLT est lui même un dialecte XML, donc manipulable avec les mêmes outils, y compris ... par du XSLT!

Plus fort, le script suivant transforme le même code XML des articles en formulaire pour modifier l'article, avec exactement la même logique

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet
  version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

<xsl:param name="doc"/>

<xsl:template match="/">
    <form action="?doc={$doc}" method="post">
    <xsl:apply-templates/>
    <br />
    <input type="submit" name="valider" value="Valider" />
    </form>
</xsl:template>

<xsl:template match="doc">
    <input type="text" style="width:300px;" name="doc_titre" value="{titre}" /><br />
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="titre"></xsl:template>

<xsl:template match="texte">
    <textarea name="doc_texte" rows="10" cols="80"><xsl:apply-templates/></textarea>
</xsl:template>

</xsl:stylesheet>

Le menu est également généré via XSLT à partir d'un fichier de données XML, mais inutile de multiplier les exemples, ils me semblent parlant.

Le code PHP

Tout ce que j'ai écris jusqu'à maintenant peut être utilisé dans n'importe quel langage, y compris avec quelques modifications dans les navigateurs qui supportent le XSLT. Mais l'outil web le plus simple étant PHP, c'est lui que j'ai utilisé. Tout d'abord, voici le code CSS/HTML avec juste quelques inclusions de PHP. Deux d'entre elles appelent Transforme qui permet de générer le XHTML à partir du XML et du XSLT, l'autre se contente de mettre l'identifiant d'un document dans un lien.

<html>
<head>
<title>Première transformation</title>
<style type="text/css">
    .colonne { float: left; width: 120px; margin: 0; }
    .colonne div { background-color: #ccccff; padding: 5px; margin: 5px;}
    .colonne ul { margin: 0px; display:inline; list-style:none;}
    .document { background-color: #cccccc; margin: 10px 10px 10px 135px; }
</style>
</head>
<body>
<div class="colonne">
    <div><?=Transforme('menu''menu')?></div>
    <div><a href="?editer=<?=$document?>">Editer la page</a></div>
</div>
<div class="document"><?=Transforme($document$xsl_doc)?></div>
</body></html>

Ce bloc de code, placé au début du fichier, initialise l'identifiant du document dans la variable $document (à partir de ce qui est passé dans l'adresse ou "accueil" par défaut). Il initialise également $xsl_doc avec les valeurs "document" ou "document_edit", en fonction des paramètres passé. Avec la première, le document sera affiché, avec la seconde, il sera édité. Le reste du code permet de prendre en compte la modification du document, et de la sauver dans le fichier XML.

<? $xsl_doc='document';
if(isset(
$_GET['doc'])) $document=$_GET['doc']; else $document='accueil';
if(isset(
$_GET['editer'])) 
    {
    
$document=$_GET['editer']; 
    
$xsl_doc='document_edit';
    
    if(isset(
$_POST['doc_titre'])) 
        {
        
$f=fopen('xml/'.$document.'.xml''w');
        
fwrite($fsprintf(CHAINEXMLstripslashes($_POST['doc_titre']), stripslashes($_POST['doc_texte'])));
        
fclose($f);
        }
    } 
?>

Enfin, on appele le moteur XSLT pour réaliser la transformation.

<? function Transforme($fXML$fXSL)
    {
    
$fichierXml='xml/'.$fXML.'.xml';
    if(!
file_exists($fichierXml)) $fichierXml='xml/erreur.xml';
    
    
$array_params = array('doc'=>$fXML);

    
$xh xslt_create();
    
$res xslt_process($xh$fichierXml'xsl/'.$fXSL.'.xsl'NULL, array(), $array_params);
    
xslt_free($xh);
    return 
$res;
    } 
?>

Conclusion

Comme vous avez pu le voir, c'est excessivement simple à utiliser, et excessivement puissant. Le simple fait de choisir l'un ou l'autre des scripts XSLT permet avec très peu de code PHP de choisir entre l'affichage et l'édition, dans un système style wiki par exemple. Mon code est certainement plein de trous, de lacunes (j'ai viré une sécurité pour le clarifier ici), mais à partir de cette base je pense qu'il y a beaucoup à faire. Par contre les balises "lien" ne sont pas affichées correctement lors de l'édition, à vous de corriger cela! ;-)

Fichier(s)

Lien(s)

30/03/2006 - Cédric Girard