didou Sat Jul 24 13:11:31 2004 EDT
Modified files:
/phpdoc/en/reference/xslt/functions xslt-set-sax-handlers.xml
Log:
document xslt_set_sax_handlers
# work based on user note and Sterling Hughes notes in php-src
http://cvs.php.net/diff.php/phpdoc/en/reference/xslt/functions/xslt-set-sax-handlers.xml?r1=1.2&r2=1.3&ty=u
Index: phpdoc/en/reference/xslt/functions/xslt-set-sax-handlers.xml
diff -u phpdoc/en/reference/xslt/functions/xslt-set-sax-handlers.xml:1.2
phpdoc/en/reference/xslt/functions/xslt-set-sax-handlers.xml:1.3
--- phpdoc/en/reference/xslt/functions/xslt-set-sax-handlers.xml:1.2 Wed Apr 17
02:45:25 2002
+++ phpdoc/en/reference/xslt/functions/xslt-set-sax-handlers.xml Sat Jul 24
13:11:30 2004
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.2 $ -->
+<!-- $Revision: 1.3 $ -->
<!-- splitted from ./en/functions/xslt.xml, last change in rev 1.29 -->
<refentry id='function.xslt-set-sax-handlers'>
<refnamediv>
@@ -16,7 +16,316 @@
<methodparam><type>array</type><parameter>handlers</parameter></methodparam>
</methodsynopsis>
<para>
- &warn.undocumented.func;
+ <function>xslt_set_sax_handlers</function> registers the SAX
+ <parameter>handlers</parameter> for the document, given a XSLT
+ <parameter>processor</parameter> resource.
+ </para>
+ <para>
+ <parameter>handlers</parameter> should be an array in the following format:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+$handlers = array(
+
+ "document" => array(
+ "start_doc",
+ "end_doc"),
+
+ "element" => array(
+ "start_element",
+ "end_element"),
+
+ "namespace" => array(
+ "start_namespace",
+ "end_namespace"),
+
+ "comment" => "comment",
+
+ "pi" => "pi",
+
+ "character" => "characters"
+
+);
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ Where the functions follow the syntax described for the scheme handler
+ functions.
+ </para>
+ <note>
+ <para>
+ 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.
+ </para>
+ </note>
+ <para>
+ Each of the individual SAX handler functions are in the format below:
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>start_doc</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>end_doc</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>start_element</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>name</parameter></methodparam>
+
<methodparam><type>array</type><parameter>attributes</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>end_element</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>name</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>start_namespace</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>prefix</parameter></methodparam>
+ <methodparam><type>string</type><parameter>uri</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>end_namespace</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>prefix</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>comment</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>contents</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>pi</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>target</parameter></methodparam>
+ <methodparam><type>string</type><parameter>contents</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <methodsynopsis>
+ <methodname><replaceable>characters</replaceable></methodname>
+
<methodparam><type>resource</type><parameter>processor</parameter></methodparam>
+ <methodparam><type>string</type><parameter>contents</parameter></methodparam>
+ </methodsynopsis>
+ </simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Using <function>xslt_set_sax_handlers</function> doesn't look very different than
+ running a SAX parser like <function>xml_parse</function> on the result of an
+ <function>xslt_process</function> transformation.
+ </para>
+ <para>
+ <example>
+ <title><function>xslt_set_sax_handlers</function> Example</title>
+ <programlisting role="php">
+<![CDATA[
+<?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);
+?>
+]]>
+ </programlisting>
+ </example>
+ </para>
+ <para>
+ Every values of the <parameter>handlers</parameter> array is either a
+ string containing the function name, or an array in the following format:
+ <command>array(&$obj, "method")</command>.
+ </para>
+ <para>
+ <example>
+ <title>Object oriented handler</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+// This is the object oriented version of the previous example
+class data_sax_handler {
+
+ var $buffer, $tag, $attrs;
+
+ function start_document()
+ {
+ // start reading the document
+ }
+
+ function end_document() {
+ // complete reading the document
+ }
+
+ function start_element($parser, $tagname, $attributes) {
+ $this->tag = $tagname;
+ $this->attrs = $attributes;
+ }
+
+ function end_element($parser, $tagname)
+ {
+ $this->tag = '';
+ }
+
+ function characters($parser, $data)
+ {
+ // Are we calling a PHP function ?
+ if ($this->tag == 'php') {
+ $function = $this->attrs['function'];
+ $data = $function($data);
+ }
+ $this->buffer .= $data;
+ }
+
+ function get_buffer() {
+ return $this->buffer;
+ }
+
+}
+
+// our xsl handle
+$xh = xslt_create();
+
+$handler = new data_sax_handler();
+// configure sax handlers
+$handlers = array(
+ "document" => array(
+ array(&$handler, 'start_document'),
+ array(&$handler, 'end_document')
+),
+ "element" => array(
+ array(&$handler, 'start_element'),
+ array(&$handler, 'end_element')
+),
+ "character" => array(&$handler, 'characters')
+);
+
+xslt_set_sax_handlers($xh, $handlers);
+
+xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, array("/_xml"=>$xml,
"/_xsl"=>$xsl));
+xslt_free($xh);
+
+?>
+]]>
+ </programlisting>
+ <para>
+ Both examples will output:
+ </para>
+ <screen role="xml">
+<![CDATA[
+<livre>
+ <auteur>GUSTAVE FLAUBERT</auteur>
+</livre>
+<livre>
+ <auteur>VIRGINIA WOOLF</auteur>
+</livre>
+]]>
+ </screen>
+ </example>
</para>
</refsect1>
</refentry>