Les fonctions de PHP peuvent être utilisées directement dans les feuilles de style XSLT.
En effet, les fonctions natives de PHP ou celles du programmeur peuvent être exploitées dans une feuille de style, en utilisant l'expression php:function dans un élément XSLT xsl:value-of. L'attribut xmlns doit également indiqué l'espace de noms http://php.net/xsl et un préfixe php.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"> <xsl:template match="/"> <xsl:value-of select="php:function('nomFonction', [liste_arguments])"/> </xsl:template> </xsl:stylesheet>
Il faut fournir à la fonction php:function() un nom de fonction et éventuellement un ou plusieurs arguments. Ces derniers doivent être séparés par des virgules et être encadrés par l'instruction string(...).
php:function('une fonction', string('arg1'), ..., string('arg2'))
En conséquence, il y a autant d'arguments à la fonction php:function() que la fonction cible en possède.
php:function('str_replace', string('cible'), string('remplacement'), string('source...')) //équivaut à str_replace('cible', 'remplacement', 'source...');
Les éléments XSLT en recèlent un particulièrement intéressant, en l'occurrence xsl:variable. Effectivement l'élément xsl:variable est capable de contenir la valeur d'un noeud XML, qu'il sera possible de passer à une fonction PHP. La modification de la valeur d'un noeud devient alors tout à fait réalisable par ce moyen.
<xsl:variable name="var" select="/chemin"/>
L'élément xsl:variable comporte deux attributs :
Une variable XSLT s'appelle dans des régles de style en faisant précéder son nom par un caractère dollar ($var). Dans un attribut, l'appel de la variable doit être entouré par des accolades : {$var}.
La méthode registerPhpFunctions() de l'objet XsltProcessor indique au processeur XSLT de prendre en compte les fonctions PHP référencées dans la feuille de style et de les exécuter lors du processus de tranformation.
$proc->registerPhpFunctions();
<?php $xml = <<<XML <?xml version="1.0" encoding="iso-8859-1" ?> <couleurs> <couleur id="white">couleur blanche</couleur> <couleur id="red">couleur rouge</couleur> <couleur id="green">couleur verte</couleur> <couleur id="blue">couleur bleue</couleur> <couleur id="black">couleur noire</couleur> </couleurs> XML; $xsl = <<<XSL <?xml version="1.0" encoding="iso-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"> <xsl:template match="/"> <h3>Les couleurs</h3> <ul> <xsl:for-each select="//couleur"> <xsl:variable name="var" select="."/> <li> <xsl:value-of select="php:function('str_replace', string('couleur '), string(''), string($var))"/> </li> </xsl:for-each> </ul> <p style="color:blue"> <xsl:value-of select="php:function('horodater')"/> </p> </xsl:template> </xsl:stylesheet> XSL; ?> <html> <body> <?php function horodater(){ $ch = 'Date d\'édition : ' . strftime("%d/%m/%Y %H:%M:%S"); return $ch; } $doc_xsl = new DomDocument(); $doc_xsl->loadXML($xsl); $doc_xml = new DomDocument(); $doc_xml->loadXML($xml); $proc = new XsltProcessor(); $proc->registerPhpFunctions(); $xsl = $proc->importStylesheet($doc_xsl); $doc = $proc->transformToDoc($doc_xml); echo $doc->saveXML(); ?> </body> </html>