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>

Reply via email to