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