xslt_set_sax_handlers
(PHP 4 >= 4.0.6)
xslt_set_sax_handlers —
Задает SAX обработчики, которые будут вызваться после разбора XML докумнента
Описание
void xslt_set_sax_handlers
( resource $processor
, array $handlers
)
Использование xslt_set_sax_handlers() не сильно
отличается от применения SAX парсера, как например
xml_parse() , к результату
xslt_process() преобразования.
Список параметров
processor
Идентификатор ссылки на XSLT-процессор, созданный функцией
xslt_create() .
handlers
handlers должны быть массивом следующего формата:
Синтаксис функций описан в документации к функциям обработки схем.
Замечание :
Заданный массив не обязан содержать все sax обработчики (хотя он
может), но элементы массива должны точно соответствовать формату
"обработчик" => "функция", описанному выше.
SAX функции-обработчики имеют следующий формат:
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
)
Возвращаемые значения
Эта функция не возвращает значения после выполнения.
Примеры
Пример #1 Пример использования xslt_set_sax_handlers()
<?php // От ohlesbeauxjours at yahoo dot fr // В этом примере к содержимому каждого тэга <auteur> // применяется функция strtoupper(), а затем выводится // результат в виде XML дерева: $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>' ; // Обработчики : function start_document () { // начало чтения документа } function end_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 ; } // Преобразование : $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 ); ?>
Также можно воспользоваться функцией xslt_set_object() ,
если требуется реализовать обработчики внутри объекта.
Пример #2 Обработчик в объектно-ориентированном стиле
<?php // Объектно-ориентированная версия предыдущего примера 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 () { // начало чтения документа } function end_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 ); ?>
Оба примера выведут следующее:
<livre>
<auteur>GUSTAVE FLAUBERT</auteur>
</livre>
<livre>
<auteur>VIRGINIA WOOLF</auteur>
</livre>