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.
Sommaire<?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(); ?>