Le langage XSLT (Extensible Stylesheet Language Transformation) permet de transformer des documents XML à partir de règles de modèles (template) en d'autres documents XML, HTML ou encore WML.
<?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="html" encoding="ISO-8859-1"/>
<xsl:param name="num"/>
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="logitheque/logiciel[$num]/nom"/>
<br/>
<xsl:value-of select="logitheque/logiciel[$num]/editeur"/>
<br/>
<xsl:choose>
<xsl:when test="logitheque/logiciel[$num]/editeur/@lien != ''">
<xsl:value-of select="logitheque/logiciel[$num]/editeur/@lien"/>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">
<xsl:text>
L'élément appelé ne contient pas d'URL !
</xsl:text>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
</xsl:stylesheet> |
Le module XSLT utilise les librairies Expat et Sablotron. Sous Unix, l'option --with-sablot ou --enable-xslt --with-xslt-sablot doivent être activées.
La création d'un analyseur XSLT s'effectue par l'entremise de la fonction xslt_create retournant un identifiant utilisable par d'autres fonctions.
$id_analyseur_XSLT = xslt_create();
L'application d'une feuille de style XSLT à un document XML est réalisée par le biais de la fonction xslt_process.
xslt_set_base('file://chemin_physique/');
$resultat = xslt_process($id_analyseur_XSLT,
$fichier_xml,
$fichier_xslt,
NULL,
$tab_args_xslt,
$tab_params_xslt);
Parfois, il peut être préférable de lire les données par des fonctions de fichier telles que fread puis de soumettre le contenu textuel à la fonction xsl_process.
La fonction xsl_process accepte également un tableau de paramètres à passer à la feuille de style, tandis que le tableau d'arguments tab_args_xslt peut être utilisé pour passer des données XML ou/et XSLT à la fonction xslt_process (voir exemple).
// Script PHP...
$parametres = array("nom_param"=>"valeur");
$arg = array('/_xml' => $donnee_xml, '/_xsl' => $donnee_xsl);
...
$resultat = xslt_process($id_analyseur_XSLT,
'arg:/_xml', 'arg:/_xsl',
NULL, $arg, $param);
...
// Feuille de style
...
<xsl:param name="nom_param"/>
...
Le résultat de la transformation est directement disponible dans la variable $resultat qui peut être affichée à l'écran par une instruction echo. Si la transformation avait échoué, le contenu de cette variable serait false.
echo $resultat;
La fonction xslt_process permet de transformer un fichier XML par une feuille de style en récupérant le résultat dans un autre fichier XML, soit le quatrième argument de cette fonction.
xslt_process($id, 'fic.xml', 'fic.xsl', 'fic_result.xml');
Les erreurs retournées par l'analyseur XSLT sont récupérées par deux fonctions xslt_errno et xslt_error fournissant respectivement son code numérique et son message.
echo sprintf('Erreur :'
. 'Code : %d'
. 'Message : %s',
xslt_errno($id_analyseur_XSLT),
xslt_error($id_analyseur_XSLT));
L'analyseur XSLT peut être détruit par la fonction xslt_free au terme de son utilisation dans un script.
xslt_free($id_analyseur_XSLT);
Il est également possible de réaliser directement des tranformations XSLT sans créer auparavant un analyseur XSLT.
La fonction xslt_transform permet d'exécuter ce genre de transformation avec à l'instar de xslt_run la possibilité de passer des paramètres et des arguments. Cette fonction est obsolète depuis la version 4.0.3.
$chaine_xsl = join ('', file('fichier.xsl'));
$chaine_xml = join ('', file('fichier.xml'));
xslt_transform($chaine_xsl, $chaine_xml,
"arg:/_result",
$tab_params, $tab_args,
$resultat);
echo $resultat;
La fonction xslt_run accomplissait de la même façon une tranformation mais est obsolète depuis la version 4.0.3 de PHP.
xslt_run($id, $xsl, $xml, $resultat, $arg, $param);
Deux fonctions opérent une transformation de toutes les données XML situées entre elles. L'une (xslt_output_begintransform) annonce le début de la transformation, l'autre (xslt_output_endtransform) la fin. Cette fonction est obsolète depuis la version 4.0.3.
<?php
$fichier_xsl = 'fichier.xsl';
xslt_output_begintransform($fichier_xsl);
$doc_xml = new_xmldoc('1.0');
$poesie = $doc_xml->new_root('poesie');
$poesie->new_child('titre', 'Locution des pierrots');
$poesie->new_child('texte', join('',file('texte.txt')));
$poesie->new_child('auteur', 'Jules Laforgue');
echo $doc_xml->dumpmem();
xslt_output_endtransform();
?>
Sommaire