L'extension XSL permet d'effectuer des transformations XSLT ( XML Stylesheet Language Transformation), c'est-à-dire, appliquer à un document XML, un ensemble de règles de restructuration des données, dans le but d'obtenir un document formaté en HTML ou dans un autre balisage XML (WML, RDF, RSS, etc.).

La transformation nécessite un document XML, une feuille de style XSLT et un processeur XSLT capable de mettre en relation les deux documents précités afin d'en générer un troisième qui contiendra le résultat de la transformation.

Le processeur XSLT est créé à partir d'une instanciation de la classe XSLTProcessor.

$proc_xsl = new XSLTProcessor();

La feuille de style XSLT doit être importée dans l'objet XSLTProcessor, après avoir été rendue disponible dans le programme par un chargement des règles de style dans un objet DOMDocument. Ceci est possible, puisque le langage XSLT n'est autre qu'un des nombreux dialectes dérivant du langage XML.

$doc_xsl = new DOMDocument();
$doc_xsl->load('regles.xsl');

$proc_xsl->importStyleSheet($doc_xsl);

Le document XML est chargé également dans un objet DOMDocument.

$doc_xml = new DOMDocument();
$doc_xml->load('document.xml');

Désormais, il ne reste plus qu'à opérer la transformation du document XML en suivant les règles de style du document XSLT. L'extension XSL propose trois méthodes de transformation à invoquer sur l'objet XSLTProcessor.

La méthode transformToXML() transforme selon la feuille de style importée, l'objet DOMDocument spécifié en une chaîne de caractères.

$resultat = $proc_xsl->transformToXML($doc_xml);

La méthode transformToURI() transforme l'objet DOMDocument en fonction des règles de style, puis stocke le résultat de la transformation dans un fichier situé à l'adresse URI spécifiée.

$nb = $proc_xsl->transformToURI($doc_xml, 'file:///resultat.html');

La méthode transformToDoc() applique les règles de style au noeud XML donné, et place le résultat de la transformation dans un objet DOMDocument.

$doc_res = $proc->transformToDoc($doc_xml);

Cette dernière méthode peut prendre un noeud du document comme argument, mais la transformation se fera malgré cela sur la totalité d'un document XML. En effet, La méthode remonte automatiquement sur le noeud DOMDocument si cela est possible.

$noeud = $doc_xml->getElementById('JF001LDP');
$doc_res = $proc->transformToDoc($noeud);
//équivaut
$doc_res = $proc->transformToDoc($noeud->ownerDocument);
<?php
  $docxml = new DOMDocument();
  $docxml->validateOnParse = true;
  $docxml->loadXML($xml);

  $docxsl = new DOMDocument();
  $docxsl->loadXML($xsl);

  $proc = new XsltProcessor();
  $proc->importStylesheet($docxsl);

  $doc = $proc->transformToDoc($docxml);
  echo '<h3>transformToDoc</h3><pre>' 
     . htmlEntities($doc->saveXML()) 
     . '</pre>';

  $nb = $proc->transformToURI($docxml, 'resultat.html');
  echo '<h3>transformToURI</h3><p>' 
     . 'Nombre d'octets écrits : ' . $nb . '</p>';

  echo '<h3>transformToXML</h3><pre>' 
     . htmlEntities($proc->transformToXML($docxml)) 
     . '</pre>';
?>

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Fichier : recueil.xml -->
<!DOCTYPE recueil [
  <!ELEMENT poesie (titre, texte, auteur)>
  <!ATTLIST poesie id ID #REQUIRED>
  <!ELEMENT titre (#PCDATA)>
  <!ELEMENT texte (#PCDATA)>
  <!ELEMENT auteur (#PCDATA)>
  <!ELEMENT recueil (poesie+)>
]>
<recueil>
  <poesie id="JF001LDP">
    <titre>Locution des pierrots</titre>
    <texte>
      Je ne suis qu'un viveur lunaire
      Qui fait des ronds dans le bassin
      Et cela, sans autre dessein
      Que de devenir légendaire.
  
      Retroussant d'un air de défin
      Mes manches de Mandarin pâle,
      J'arrondis ma bouche et - j'exhale
      Des conseils doux de Crucifix
  
      Ah! oui, devenir légendaire,
      Au seuil des siècles charlatans !
      Mais où sont les Lunes d'antan ?
      Et que Dieu n'est-il à refaire ?
    </texte>
    <auteur>Jules Laforgue</auteur>
  </poesie>
  <!-- ... -->
  <poesie id="PV002OTA">
    <titre>Ô triste, triste était mon âme</titre>
    <texte>
      Ô triste, triste était mon âme 
      À cause, à cause d'une femme. 
      Je ne me suis pas consolé 
      Bien que mon coeur s'en soit allé, 
      Bien que mon coeur, bien que mon âme 
      Eussent fui loin de cette femme. 
      Je ne me suis pas consolé 
      Bien que mon coeur s'en soit allé. 
      Et mon coeur, mon coeur trop sensible 
      Dit à mon âme : Est-il possible, 
      Est-il possible, - le fût-il - 
      Ce fier exil, ce triste exil ? 
      Mon âme dit à mon coeur: Sais-je 
      Moi-même que nous veut ce piège 
      D'être présents bien qu'exilés, 
      Encore que loin en allés ?
    </texte>
    <auteur>Paul Verlaine</auteur>
  </poesie>
</recueil>

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Fichier : style.xsl -->
<xsl:stylesheet version="1.0" 
                            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                            xmlns="http://www.w3.org/TR/xhtml1/strict">
  <xsl:output method="html" encoding="ISO-8859-1"/>
  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="poesie">
    <h2 align="center">
      <xsl:value-of select="titre"/>
    </h2>
    <div align="center">
      <pre>
        <xsl:value-of select="texte"/>
      </pre>
    </div>
    <h4 align="center">
      <xsl:value-of select="auteur"/>
    </h4>
  </xsl:template>
</xsl:stylesheet>