Description
mixed
xslt_process ( resource xh, string xmlcontainer, string xslcontainer [, string resultcontainer [, array arguments [, array parameters]]] )
xslt_process() fait partie de la nouvelle vague de
fonctions XSLT. Elle vous permet de réaliser des
transformations XSLT en utilisant n'importe quelle
type de source : des conteneurs. Cela se fait grâce à l'utilisation de
buffers d'arguments : un concept issu de
Sablotron (actuellement, c'est le seul
processeur XSLT qui le supporte). Les conteneurs sont,
par défaut, des fichiers qui contiennent le document à traiter. Le
conteneur de résultat est, par défaut, un fichier qui recevra le document
traité. Si le conteneur de résultat n'est pas fourni (l'argument vaut
alors NULL), le résultat sera retourné par la fonction.
| Avertissement |
Depuis PHP 4.0.6, cette fonction n'accepte plus de chaînes XML dans les
paramètres xmlcontainer ou
xslcontainer. Passer une chaîne contenant
du XML dans un de ces paramètres engendrera une erreur de segmentation
dans les versions Sablotron supérieures ou égales à 0.95.
|
Les conteneurs peuvent aussi être modifiés via
le tableau arguments.
Le type le plus simple de transformation réalisable avec
xslt_process() est la transformation d'un fichier
XML avec un fichier XSLT,
en plaçant le résultat dans un troisième fichier.
Faire cela avec Sablotron est très facile...
Exemple 1. Utilisation de xslt_process() pour transformer un fichier
XML avec un fichier XSL en un autre fichier XML
<?php
/* Allocation du processeur XSLT */ $xh = xslt_create();
/* Traitement du document */ if (xslt_process($xh, 'sample.xml', 'sample.xsl', 'result.xml')) { echo "Réussi. sample.xml a été transformé par sample.xsl en result.xml"; echo ", result.xml contient ceci : \n<br />\n"; echo "<pre>\n"; readfile('result.xml'); echo "</pre>\n"; } else { echo "Désolé, sample.xml n'a pu être transformé par sample.xsl en "; echo " result.xml. La raison est " . xslt_error($xh) . " et "; echo " le code d'erreur est " . xslt_errno($xh); }
xslt_free($xh);
?>
|
|
Même si cette fonctionnalité est très pratique, il arrive souvent qu'en environnement
web, vous vouliez être capable d'afficher directement votre résultat. Par conséquent,
si vous omettez le troisième argument de xslt_process(), ou que
vous fournissez la valeur NULL Ã la place, la fonction va automatiquement
retourner le résultat de la transformation XSLT, au lieu de l'écrire dans un
fichier.
Exemple 2. Utilisation de xslt_process() pour transformer un fichier
XML avec un fichier XSL et le placer dans une variable
<?php
/* Allocation d'un analyseur XSLT */ $xh = xslt_create();
/* Traitement du document */ $result = xslt_process($xh, 'sample.xml', 'sample.xsl'); if ($result) { echo "Réussi. sample.xml a été transformé par sample.xsl en result.xml"; echo ", result.xml contient ceci : \n<br />\n"; echo "<pre>\n"; echo $result; echo "</pre>\n"; } else { echo "Désolé, sample.xml n'a pu être transformé par sample.xsl en "; echo " result.xml. La raison est " . xslt_error($xh) . " et "; echo " le code d'erreur est " . xslt_errno($xh); }
xslt_free($xh);
?>
|
|
Les deux cas de transformations XSLT ci-dessus sont
les cas les plus simples, quand on parle de transformation
XSLT, et ce sont les cas les plus courants, mais
il existe des situations où vous obtenez vos données XML
et XSLT de sources externes comme des sockets ou
des bases de données. Dans ces cas, vous avez déjà les données dans une
variable et, en mode de production, écrire ces données dans des fichiers serait
trop inefficace. C'est là où la syntaxe de buffers d'arguments de XSLT
prend la relève. Au lieu de fichiers en termes d'arguments
XML et XSLT, vous pouvez
passer des buffers d'arguments, qui sont alors substitués en valeur au
cinquième argument de la fonction xslt_process().
L'exemple suivant vous montre comment traiter du
XML et du XSLT issus de variables,
et de retrouver le résultat dans une troisième variable.
Exemple 3. Utilisation de xslt_process() pour transformer une variable
XML avec une autre variable XSL et placer le
résultat dans une variable
<?php /* $xml et $xsl contiennent des données XML et XSL */
$arguments = array( '/_xml' => $xml, '/_xsl' => $xsl );
/* Allocation d'un analyseur XSLT */ $xh = xslt_create();
/* Traitement du document */ $result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); if ($result) { echo "Réussi. sample.xml a été transformé par sample.xsl en result.xml"; echo ", result.xml contient ceci : \n<br />\n"; echo "<pre>\n"; echo $result; echo "</pre>\n"; } else { echo "Désolé, sample.xml n'a pu être transformé par sample.xsl en "; echo " result.xml. La raison est " . xslt_error($xh) . " et "; echo " le code d'erreur est " . xslt_errno($xh); } xslt_free($xh); ?>
|
|
Finalement, le dernier argument de xslt_process()
représente un tableau de tous les paramètres que vous souhaitez passer
au document XSLT. Ces paramètres sont accessibles depuis le fichier
XSL en utilisant l'instruction
<xsl:param name="parameter_name">.
Les paramètres doivent être encodés au format UTF-8
et leur valeur sera interprétée comme une chaîne de
caractères par l'analyseur Sablotron.
En d'autres termes, vous ne pouvez pas passer des groupes de noeuds
(node-sets) comme paramètres au document XSLT.
Exemple 4. Passer des variables PHP Ã un fichier XSL
<?php
// XML string $xml = '<?xml version="1.0"?> <para> change me </para>';
// XSL string $xsl = ' <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="ISO-8859-1" indent="no" omit-xml-declaration="yes" media-type="text/html"/> <xsl:param name="myvar"/> <xsl:param name="mynode"/> <xsl:template match="/"> Ma variable PHP : <xsl:value-of select="$myvar"/><br /> Mon node set : <xsl:value-of select="$mynode"/> </xsl:template> </xsl:stylesheet>';
$xh = xslt_create();
// le deuxième paramètre sera interprété comme une chaîne $parameters = array ( 'myvar' => 'test', 'mynode' => '<foo>bar</foo>' );
$arguments = array ( '/_xml' => $xml, '/_xsl' => $xsl );
echo xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments, $parameters);
?>
|
L'exemple ci-dessus va afficher : Ma variable PHP : test<br />
Mon node set : <foo>bar</foo> |
|
Note : Notez que vous devez préfixer le chemin
par file:// si vous utilisez Windows.