PHP 5.3 : Profiling XSLT
31 octobre 2008 —Les exemples correspondant à ce point se trouvent dans le répertoire "xslt".
Pour ceux d'entre vous qui utilisent les fonctionnalités de transformation XSL fournies par PHP, PHP 5.3 comporte une nouveauté qui vous intéressera : le profiling lors de transformations XSL !
Prenons par exemple de fichier XML suivant (que j'ai honteusement recopié de la documentation PHP) :
<collection>
<cd>
<title>Fight for your mind</title>
<artist>Ben Harper</artist>
<year>1995</year>
</cd>
<cd>
<title>Electric Ladyland</title>
<artist>Jimi Hendrix</artist>
<year>1997</year>
</cd>
</collection>
Et l'exemple de feuille XSL correspondant (lui aussi recopié de la documentation -- mes notions de XSL sont plutôt vagues, et elles commencent à dater :-( ) :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="owner" select="'Nicolas Eliaszewicz'"/>
<xsl:output method="html" encoding="iso-8859-1" indent="no"/>
<xsl:template match="collection">
Hey! Welcome to<xsl:value-of select="$owner"/>'s sweet CD collection!
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="cd">
<h1>
<xsl:value-of select="title"/>
</h1>
<h2>
by<xsl:value-of select="artist"/>-<xsl:value-of select="year"/>
</h2>
<hr/>
</xsl:template>
</xsl:stylesheet>
La transformation du document XML en code HTML à l'aide de la feuille XSL se fait de la manière suivante :
$doc = new DOMDocument();
$xsl = new XSLTProcessor();
$doc->load(__DIR__ . '/example-1.xsl');
$xsl->importStyleSheet($doc);
$doc->load(__DIR__ . '/example-1.xml');
$xsl->setProfiling('/tmp/profile.txt');
echo $xsl->transformToXML($doc);
En quelques mots :
- Instanciation des objets
DOMDocument
etXSLTProcessor
, permettant respectivement le travail avec des documents XML et leur transformation, - Chargement de la feuille de style,
- Chargement du document XML,
- Et enfin, transformation en HTML.
Il devient maintenant possible d'activer un profiler sur cette transformation, en utilisant la méthode setProfiling
de la classe XSLTProcessor
, qui prend en paramètre le chemin vers un fichier de sortie, au sein duquel seront enregistrées les informations de profiling :
$xsl->setProfiling('/tmp/profile.txt');
Cette méthode est, bien entendu, à appeler avant de lancer la transformation.
Une fois la transformation XSL effectuée, le fichier de profiling contiendra quelque chose de cette forme :
$ cat /tmp/profile.txt number match name mode Calls Tot 100us Avg 0 collection 1 8 8 1 cd 2 6 3 Total 3 14
Ici, par exemple, nous avons traité une "collection", et deux "cd" -- ce qui correspond au contenu que nous avions dans notre fichier XML.
Et nous avons les temps d'exécution de la transformation pour chaque partie du document.
Voila qui aidera à améliorer les performances pour les transformations complexes de longs documents !