xslt_set_sax_handlers xslt_set_sax_handlers (PHP 4 >= 4.0.6, PECL)
xslt_set_sax_handlers --
Set the SAX handlers to be called when the XML document gets processed
Description void
xslt_set_sax_handlers ( resource processor, array handlers )
xslt_set_sax_handlers() registers the SAX
handlers for the document, given a XSLT
processor resource.
handlers should be an array in the following format:
Where the functions follow the syntax described for the scheme handler
functions.
Note:
The given array does not need to contain all of the different sax
handler elements (although it can), but it only needs to conform to
"handler" => "function" format described above.
Each of the individual SAX handler functions are in the format below:
start_doc ( resource processor )
end_doc ( resource processor )
start_element ( resource processor, string name, array attributes )
end_element ( resource processor, string name )
start_namespace ( resource processor, string prefix, string uri )
end_namespace ( resource processor, string prefix )
comment ( resource processor, string contents )
pi ( resource processor, string target, string contents )
characters ( resource processor, string contents )
Using xslt_set_sax_handlers() doesn't look very different than
running a SAX parser like xml_parse() on the result of an
xslt_process() transformation.
Examples Example 1. xslt_set_sax_handlers() Example
<?php // From ohlesbeauxjours at yahoo dot fr // Here's a simple example that applies strtoupper() on // the content of every <auteur> tag and then displays the // resulting XML tree: $xml = '<?xml version="1.0"?> <books> <book> <title>Mme Bovary</title> <author>Gustave Flaubert</author> </book> <book> <title>Mrs Dalloway</title> <author>Virginia Woolf</author> </book> </books>' ; $xsl = '<?xml version="1.0"?> <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"/> <xsl:template match="/"> <xsl:for-each select="books/book"> <livre> <auteur><xsl:value-of select="author/text()"/></auteur> </livre> </xsl:for-each> </xsl:template> </xsl:stylesheet>' ; // Handlers : function start_document () { // start reading the document } function end_document () { // end reading the document } function start_element ( $parser , $name , $attributes ) { global $result , $tag ; $result .= "<" . $name . ">" ; $tag = $name ; } function end_element ( $parser , $name ) { global $result ; $result .= "</" . $name . ">" ; } function characters ( $parser , $data ) { global $result , $tag ; if ( $tag == "auteur" ) { $data = strtoupper ( $data ); } $result .= $data ; } // Transformation : $xh = xslt_create (); $handlers = array( "document" => array( "start_document" , "end_document" ), "element" => array( "start_element" , "end_element" ), "character" => "characters" ); xslt_set_sax_handlers ( $xh , $handlers ); xslt_process ( $xh , 'arg:/_xml' , 'arg:/_xsl' , NULL , array( "/_xml" => $xml , "/_xsl" => $xsl )); xslt_free ( $xh ); ?>
You can also use xslt_set_object() if you want to
implement your handlers in an object.
Example 2. Object oriented handler
<?php // This is the object oriented version of the previous example class data_sax_handler { var $buffer , $tag , $attrs ; var $_xh ; function data_sax_handler ( $xml , $xsl ) { // our xslt resource $this -> _xh = xslt_create (); xslt_set_object ( $this -> _xs , $this ); // configure sax handlers $handlers = array( "document" => array( 'start_document' , 'end_document' ), "element" => array( 'start_element' , 'end_element' ), "character" => 'characters' ); xslt_set_sax_handlers ( $this -> _xh , $handlers ); xslt_process ( $this -> _xh , 'arg:/_xml' , 'arg:/_xsl' , NULL , array( "/_xml" => $xml , "/_xsl" => $xsl )); xslt_free ( $this -> _xh ); } function start_document () { // start reading the document } function end_document () { // complete reading the document } function start_element ( $parser , $name , $attributes ) { $this -> tag = $name ; $this -> buffer .= "<" . $name . ">" ; $this -> attrs = $attributes ; } function end_element ( $parser , $name ) { $this -> tag = '' ; $this -> buffer .= "</" . $name . ">" ; } function characters ( $parser , $data ) { if ( $this -> tag == 'auteur' ) { $data = strtoupper ( $data ); } $this -> buffer .= $data ; } function get_buffer () { return $this -> buffer ; } } $exec = new data_sax_handler ( $xml , $xsl ); ?>
Both examples will output:
<livre>
<auteur>GUSTAVE FLAUBERT</auteur>
</livre>
<livre>
<auteur>VIRGINIA WOOLF</auteur>
</livre>