Descrizione
mixed
xslt_process ( resource xh, string xmlcontainer, string xslcontainer [, string resultcontainer [, array arguments [, array parameters]]] )
La funzione xslt_process() è una delle più importanti della
nuova estensione XSLT. Permette di eseguire una trasformazione XSLT usando quasi ogni tipo di
fonte per l'input - i contenitori. Questa è un completamento mediante l'uso dell'argomento
buffers -- un concetto preso dal processore XSLT Sablotron
(attualmente l'unico processore XSLT supportato da questa estensione).
Il contenituore di input di default è il nome del file del documento
trasformato. Se il contenitore di destinaizone non viene fornito, ad esempio
è impostato a NULL - alla la funzione restituisce il risultato.
Avvertimento |
Questa funzione ha modifica i propri argomenti dalla versione 4.0.6. Infatti non
fornire più il contenuto XML o XSL come secondi e terzi argomenti, poichè questi
creano un segmentation fault in Sablotron fino alla versione
0.95 inclusa.
|
I contenitori possono essere impostati anche tramite la matrice
$arguments (vedere più avanti).
Il più semplice tipo di trasformazione con la funzione xslt_process()
è la trasformazione di un file XML con un file XSLT, mettendo il
risultato in un terzo file contenente un nuovo documento XML (o HTML).
Fare questo con Sablotron è davvero molto semplice...
Esempio 1. Uso di xslt_process() per trasformare un file XML e un file XSL
in un nuovo file XML
<?php
// Allocate a new XSLT processor $xh = xslt_create();
// Process the document if (xslt_process($xh, 'sample.xml', 'sample.xsl', 'result.xml')) { echo "SUCCESS, sample.xml was transformed by sample.xsl into result.xml"; echo ", result.xml has the following contents\n<br />\n"; echo "<pre>\n"; readfile('result.xml'); echo "</pre>\n"; } else { echo "Sorry, sample.xml could not be transformed by sample.xsl into"; echo " result.xml the reason is that " . xslt_error($xh) . " and the "; echo "error code is " . xslt_errno($xh); }
xslt_free($xh);
?>
|
|
Mentre questa funzionalità è importante, a volte, specialmente in un ambiente web, si vorrebbe
avere la possibilità di scrivere a video il risultato direttamente. Quindi, se si omette il terzo argomento
alla funzione xslt_process() (o si inserisce il valore NULL per l'argomento), lo script
restituirà automaticamente il valore della trasformazione dell'XSLT, invece di scriverlo in un
file...
Esempio 2. Uso di xslt_process() per trasformare un file XML e uno XSL
in una variabile contenente i dati XML restituiti
<?php
// Allocate a new XSLT processor $xh = xslt_create();
// Process the document, returning the result into the $result variable $result = xslt_process($xh, 'sample.xml', 'sample.xsl'); if ($result) { echo "SUCCESS, sample.xml was transformed by sample.xsl into the \$result"; echo " variable, the \$result variable has the following contents\n<br />\n"; echo "<pre>\n"; echo $result; echo "</pre>\n"; } else { echo "Sorry, sample.xml could not be transformed by sample.xsl into"; echo " the \$result variable the reason is that " . xslt_error($xh) . echo " and the error code is " . xslt_errno($xh); }
xslt_free($xh);
?>
|
|
I due casi sopra sono i due casi più semplici che ci sono quando c'è una trasformazione XSLT
e c'è da dire che dovreste essere per la maggior parte delle volte in questi casi, ma, a volte, puoi prendere il tuo
codice XML e XSLT da fonti esterne, come database e socket. In questi casi, avrai
i dati XML e/o XSLT in una variabile -- nella produzione di applicazioni l'overhead per scaricare
questo codice al file potrebbere essere eccessivo. Qui la sinstassi degli argomenti dell'XSLT ci
aiuta. Invece dei file come argomenti XML e XSLT alla funzione xslt_process(),
puoi specificare l' "argument place holders" il quale è poi sostituito dal valore
dato nell'argomento dell'array (il quinto parametro della funzione xslt_process()).
Di seguito c'è un esempio del processo di inserimento di codice XML e XSLT senza
l'ausilio di file.
Esempio 3. Uso di xslt_process() per trasformare una variabile contenente dati XML
e una variabile contenente dati XSL in una variabile contenente i dati XML risultanti
<?php // $xml and $xsl contain the XML and XSL data
$arguments = array( '/_xml' => $xml, '/_xsl' => $xsl );
// Allocate a new XSLT processor $xh = xslt_create();
// Process the document $result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); if ($result) { echo "SUCCESS, sample.xml was transformed by sample.xsl into the \$result"; echo " variable, the \$result variable has the following contents\n<br />\n"; echo "<pre>\n"; echo $result; echo "</pre>\n"; } else { echo "Sorry, sample.xml could not be transformed by sample.xsl into"; echo " the \$result variable the reason is that " . xslt_error($xh) . echo " and the error code is " . xslt_errno($xh); } xslt_free($xh); ?>
|
|
Finalmente, l'ultimo argomento della funzione xslt_process()
rappresenta una matrice di qualsiasi parametro di alto livello che si desidera
passare al documento XSLT. Questi parametri possono essere referenziati
dal file XSL utilizzando l'istruzione <xsl:param name="parameter_name">.
I parametri devono avere la codifica UTF-8 ed i rispettivi valori devono
essere interpretati come stringhe dal processore Sablotron.
In altre parole non si possono passare come parametri al documento XSLT dei node-set.
Esempio 4. Passaggio di variabili PHP al file XSL
<?php // XML string $xml = '<?xml version="1.0"?> <para> change me </para>'; // stringa XSL $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="/"> My PHP variable : <xsl:value-of select="$myvar"/><br /> My node set : <xsl:value-of select="$mynode"/> </xsl:template> </xsl:stylesheet>'; $xh = xslt_create(); // Il secondo parametro sarà interpretato come stringa $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); ?>
|
Il precedente esempio visualizzerà: My PHP variable : test<br>
My node set : <foo>bar</foo> |
|
Nota: Please note that file://
is needed in front of path if you use Windows.