Forum und email

xslt_process

(PHP 4 >= 4.0.3)

xslt_process — Esegue una trasformazione XSLT

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.

Avviso

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...

Example#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...

Example#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.

Example#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.

Example#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="https://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 : &lt;foo&gt;bar&lt;/foo&gt;

Nota: Si noti che file:// è necessario all'inizio del path se si usa Windows.