dleslie     01/06/08 11:54:51

  Modified:    c/xdocs/sources/xalan getstarted.xml usagepatterns.xml
  Log:
  First pass at revising usage patterns to reflect XalanTransformer C++ and C APIs.
  
  Revision  Changes    Path
  1.26      +1 -1      xml-xalan/c/xdocs/sources/xalan/getstarted.xml
  
  Index: getstarted.xml
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/xdocs/sources/xalan/getstarted.xml,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- getstarted.xml    2001/02/20 13:38:09     1.25
  +++ getstarted.xml    2001/06/08 18:54:48     1.26
  @@ -15,7 +15,7 @@
   Please contact us at <human-resource-ref idref="xalandev"/> if you would like to 
help provide builds for other platforms.</p>
   <anchor name="xalandists"/>
   <s3 title="&xslt4c; Windows Distribution">
  -<p><img src="xalan-c-windist.gif" alt="xalan-cdist.gif"/></p>
  +<p><img src="xalan-c-windist.gif" alt="xalan-c-windist.gif"/></p>
   </s3>
   <p>For the Windows32 build, download <resource-ref idref="xslt4c-win32-download"/>. 
This Windows32 distribution was built with MSVC 6.0 SP3 and <jump 
href="http://www.dinkumware.com/vc_fixes.html";>Dinkumware C++ library fixes</jump>.</p>
   <s3 title="&xslt4c; UNIX Distributions">
  
  
  
  1.25      +157 -304  xml-xalan/c/xdocs/sources/xalan/usagepatterns.xml
  
  Index: usagepatterns.xml
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/xdocs/sources/xalan/usagepatterns.xml,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- usagepatterns.xml 2001/02/21 22:33:20     1.24
  +++ usagepatterns.xml 2001/06/08 18:54:49     1.25
  @@ -59,238 +59,138 @@
   <s1 title="&xslt4c; Basic usage patterns">
   <ul>
   <li><link anchor="intro">Introduction</link></li>
  -<li><link anchor="xalantransformer">Using the XalanTransformer class</link></li>
  -<li><link anchor="basic">Basic procedure for performing XSL 
transformations</link></li>
  -<li><link anchor="dom">Working with DOM input and output</link></li>
  +<li><link anchor="cpp">Basic usage pattern with the XalanTransformer C++ 
API</link></li>
  +<li><link anchor="stylepi">Using a stylesheet processing instruction</link></li>
   <li><link anchor="params">Setting stylesheet parameters</link></li>
  -<li><link anchor="compiled">Compiling stylesheets</link></li>
  +<li><link anchor="incremental">Processing output incrementally</link></li>
  +<li><link anchor="compiled">Performing a series of transformations</link></li>
  +<li><link anchor="dom">Working with DOM input and output</link></li>
   <li><link anchor="xpath">Working with XPath expressions</link></li>
   <li><link anchor="tracelistener">Using the TraceListener</link></li>
   <li><link anchor="icu">Using the International Components for Unicode 
(ICU)</link></li>
  +<li><link anchor="capi">Basic usage pattern with the XalanTransformer C 
API</link></li>
  +<li><link anchor="cvar">Variations with the XalanTransformer C API</link></li>
   <li>See also: <link idref="extensions">Creating and using extension 
functions</link></li>
   </ul><anchor name="intro"/>
   
  -  <s2 title="Introduction">  
  -<p>&xslt4c; takes as primary input an XML source document and an XSL stylesheet, 
both represented by instances of <jump 
href="apidocs/class_XSLTInputSource.html">XSLTInputSource</jump>. These input objects 
may each take the form of a file or URL, a stream, or a DOM tree. The stylesheet may 
also take the form of a compiled stylesheet (an instance of <jump 
href="apidocs/class_stylesheetroot.html">StylesheetRoot</jump>).</p>
  -<note>If the XML source document contains a stylesheet Processing Instruction (PI), 
&xslt4c; uses the stylesheet this PI points to and a separate stylesheet object is not 
required. </note>
  -<p>&xslt4c; uses &xml4c; to parse text input, performs the transformation, and 
sends the output to an instance of <jump 
href="apidocs/class_xsltresulttarget.html">XSLTResultTarget</jump>, which may be 
configured to write to a file, a stream, or a DOM tree.</p>
  +<s2 title="Introduction">  
  +<p>To perform a transformation, use one of the <jump 
href="apdidocs/class_xalantransformer.html">XalanTransformer</jump> transform() 
methods. The transformation requires an XML source document and an XSL stylesheet. 
Both of these objects may be represented by instances of <jump 
href="apidocs/class_xsltinputsource.html">XSLTInputSource</jump>. You can construct an 
XSLTInputSource with a string (the system ID for a file or URI), an input stream, or a 
DOM.</p>
  +<p>If you are using an XSL stylesheet to perform a series of transformations, you 
can improve performance by calling transfomr() with a compiled stylesheet, an instance 
of <jump 
href="apidocs/class_xalancompiledstylesheet.html">XalanCompiledStylesheet</jump>. If 
you are transforming an XML source more than once, you should call transform() with a 
parsed XML source, an instance of <jump 
href="apidocs/class_xalanparsedsource">XalanParsedSource</jump>. See <link 
anchor="compiled">Performing a series of transformations</link>.</p>
  +<p>If you XML source document contains a stylesheet Processing Instruction (PI), 
you do not need to include a stylesheet object when you call transform().</p>
  +<p>The transformation output is represented by an <jump 
href="apdidocs/class_xsltresulttarget.html">XSLTResultTarget</jump>, which you can set 
up to refer to an output stream, the system ID for a file or URI, or a DOM.</p>
   <p>For detailed API documentation, see <jump href="apidocs/index.html">&xslt4c; 
API</jump>. For an overview of the
   command-line utility, see <link idref="commandline">Command-Line Utility</link>.</p>
  -</s2><anchor name="xalantransformer"/>
  -<s2 title="Using the XalanTransformer class">
  -<p>&xslt4c; 1.1 introduces XalanTransformer, a new class designed to package the 
basic Xalan infrastructure and provide a simpler C++ 
  -and C API for performing standard transformations.</p>
  -<note>As we expand the functionality of the XalanTransformer, we will revise the 
remainder of this chapter and the samples to indicate 
  -how to take advantage of the API it provides.</note>
  +</s2><anchor name="cpp"/>
  +<s2 title="Basic usage patten with the XalanTransformer C++ API">
  +<p>Using <jump href="apdidocs/class_xalantransformer.html">XalanTransformer</jump> 
and the C++ API, you can perform one or more transformations as described in the 
following steps.</p>
  +<note>For a working sample that illustrates these steps, see the <link 
idref="samples" anchor="xalantransform">XalanTransform</link> sample.</note>
  +<s3 title="1. Include the required header files.">
  +<p>Always start with Include/PlatformDefinitions.hpp, the &xslt4c; base header 
file. Also include util/PlatformUtils.hpp, XalanTransformer/XalanTransformer.hpp, and 
any other header files your particular application requires.</p>
  +<source>#include &lt;Include/PlatformDefinitions.hpp&gt;
  +#include &lt;util/PlatformUtils.hpp&gt;
  +#include &lt;XalanTransformer/XalanTransformer.hpp&gt;
  +...</source>
  +</s3>
  +  <s3 title="2. Initialize Xerces and Xalan">
  +<p>Use the static initializers to initialize the &xslt4c; and &xml4c; platforms. 
You must initialize &xml4c; once per process. You may initialize and terminate 
&xslt4c; multiple times, but this is not recommended: it is inefficient and is not 
thread safe.</p>  
  +<source>XMLPlatformUtils::Initialize();
  +XalanTransformer::initialize();</source>
  +</s3>
  +  <s3 title="3.Create a XalanTransformer">
  +  <source>XalanTransformer theXalanTransformer;</source>
  +  </s3>
  +  <s3 title="4. Perform each transformation">
  +    <p>You can explicitly instantiate <jump 
href="apidocs/class_xsltinputsource.html">XSLTInputSource</jump> objects for the XML 
source document and XSL stylesheet, and an <jump 
href="apidocs/class_xsltresulttarget.html">XSLTResultTarget</jump> object for the 
output, and then call <jump 
href="apdidocs/class_xalantransformer.html">XalanTransformer</jump> transform() with 
those objects as parameters. For example:</p>
  +<source>XSLTInputSource xmlIn("foo.xml");
  +XSLTInputSource xslIn("foo.xsl");
  +XSLTResultTarget xmlOut("foo-out.xml");
  +int theResult =
  +    theXalanTransformer.transform(xmlIn,xslIn,xmlOut)</source>
  +   <p>Alternatively, you can call transform() with the strings (system 
identifiers), streams, and/or DOMs that the compiler needs to implicitly construct the 
<jump href="apidocs/class_xsltinputsource.html">XSLTInputSource</jump> and <jump 
href="apidocs/class_xsltresulttarget.html">XSLTResultTarget</jump> objects. For 
example:</p>
  +<source>const char* xmlIn = "foo.xml";
  +const char* xslIn = "foo.xsl";
  +const char* xmlOut = "foo-out.xml";
  +int theResult =
  +    theXalanTransformer.transform(xmlIn,xslIn,xmlOut)</source>
  + <p>Keep in mind that <jump 
href="apidocs/class_xsltinputsource.html">XSLTInputSource</jump> and <jump 
href="apidocs/class_xsltresulttarget.html">XSLTResultTarget</jump> provide a variety 
of single-argument constructors that you can use in this manner:</p>
   <ul>
  -  <li><link anchor="cpp">Basic usage pattern with the XalanTransformer C++ 
API</link></li>
  -  <li><link anchor="cppvar">Variations with the XalanTransformer C++ 
API</link></li>  
  -  <li><link anchor="capi">Basic usage pattern with the XalanTransformer C 
API</link></li>
  -  <li><link anchor="cvar">Variations with the XalanTransformer C API</link></li>  
  -</ul><anchor name="cpp"/>
  -<s3 title="Basic usage patten with XalanTransformer C++ API">
  -<p>Using XalanTransformer and the C++ API, you can perform one or more 
transformations as follows:</p>
  -<ol>
  -  <li>Include the PlatformUtils and XalanTransformer header files.<br/>
  -  <code>#include &lt;util/PlatformUtils.hpp&gt;</code><br/>
  -  <code>#include &lt;XalanTransformer/XalanTransformer.hpp&gt;</code><br/><br/></li>
  -  <li>Initialize Xerces and Xalan.<br/>
  -  <code>XMLPlatformUtils::Initialize();</code><br/>
  -  <code>XalanTransformer::initialize();</code><br/><br/></li>
  -  <li>Create a XalanTransformer.<br/>
  -  <code>XalanTransformer theXalanTransformer;</code><br/><br/></li>
  -  <li>Use one of the XalanTransformer transform() methods to perform each 
transformation. For example:<br/>
  -  <code>const char* xmlIn = "foo.xml";</code><br/>
  -  <code>const char* xslSheet = "foo.xsl";</code><br/>
  -  <code>const char* xmlOut = "foo.out";</code><br/>
  -  <code>int theResult = 0;</code><br/>
  -  <code>theResult =</code><br/>
  -  
<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theXalanTransformer.transform(xmlIn,xslSheet,xmlOut);</code><br/><br/></li>
  -  <li>Shut down Xalan and (optionally) Xerces.<br/>
  -  <code>XalanTransformer::terminate();</code><br/>
  -  <code>XMLPlatformUtils::Terminate();</code></li>
  -</ol>
  -</s3><anchor name="cppvar"/>
  -<s3 title="Variations with the XalanTransformer C++ API">
  -<p>The XalanTransformer transform() methods also allow you to process and produce 
streams, and to send the output in blocks to a callback 
  -function, which means you can begin processing the output while the transformation 
is still in progress. Each transform() method returns 
  -an integer code, 0 for success. If an error occurs, you can use the getLastError() 
method to return a pointer to the error message. 
  -For the details, see XalanTransormer/XalanTransformer.hpp in the source tree. For 
an example, see the 
  -<link idref="samples" anchor="xalantransform">XalanTransform</link> sample.</p>
  -<p>Transform an XML file with a stylesheet processing instruction to an output 
file.</p>
  -<source>int
  -transform(const  char*  xmlInFile, 
  -          const  char*  xmlOutFile);</source>
  -<p>Transform from files to an output stream:</p>
  -<source>int
  -transform(const char* xmlInFile,
  -          const char* xslFile,
  -          ostream&amp;    resultOutStream);</source>
  -<p>Transform from input streams to an output stream:</p>
  -<source>int
  -transform(istream&amp; xmlInStream,
  -          istream&amp; xslInStram,
  -          ostream&amp; resultOutStream);</source>
  -<p>Transform an input stream that contains the XML input with a stylesheet 
processing instruction to an output stream.</p>
  -<source>int
  -transform(istream&amp; xmlInStream,
  -          ostream&amp; resultOutStream);</source>
  -
  -<p>Transform from files to an output handler that receives the output in blocks. 
</p>          
  +  <li><code>XSLTInputSource(const char* systemID);</code></li>
  +  <li><code>XSLTInputSource(const XMLCh* systemID);//Unicode chars</code></li>
  +  <li><code>XSLTInputSource(istream* stream);</code></li>
  +  <li><code>XSLTInputSource(XalanNode* node);</code><br/><br/></li>
  +  <li><code>XSLTResultTarget(char* fileName);</code></li>
  +  <li><code>XSLTResultTarget(XalanDOMString&amp; fileName);</code></li>
  +  <li><code>XSLTResultTarget(ostream* stream);</code></li>
  +  <li><code>XSLTResultTarget(ostream&amp; stream);</code></li>  
  +  <li><code>XSLTResultTarget(Writer* characterStream);</code></li>
  +  <li><code>XSLTResultTarget(XalanDocument* document);</code></li>
  +  <li><code>XSLTResultTarget(XalanDocumentFragment* documentFragment);</code></li>
  +  <li><code>XSLTResultTarget(XalanElement* element);</code></li>
  +</ul>
  +<note>Each transform() method returns an integer code, 0 for success. If an error 
occurs, you can use the getLastError() method to return a pointer to the error 
message.</note>
  +</s3>
  +<s3 title="5. Shut down Xalan and (optionally) Xerces">
  +<p>Use the static terminators.</p>
  +<source>XalanTransformer::terminate();
  +XMLPlatformUtils::Terminate();</source>
  +  <note>Once you have shut down Xerces, you can no longer make Xalan or Xerces 
calls in the current process.</note>
  +</s3></s2><anchor name="stylepi"/>
  +<s2 title="Using a stylesheet processing instruction">
  +<p>If you want to use the stylesheet referred to by a stylesheet processing 
instruction in the XMl document, simply call transform() without the second 
XSLTInputSource argument. For example:</p>
  +<source>// foo.xml contains a stylesheet PI
  +const char* xmlIn = "foo.xml";
  +const char* xmlOut = "foo-out.xml";
  +int theResult =
  +    theXalanTransformer.transform(xmlIn,xmlOut)</source>
  +</s2><anchor name="params"/>
  +<s2 title="Setting stylesheet parameters">
  +<p>An XSL stylesheet can include parameters that are set at run time before a 
transformation takes place. When we generate the HTML documents that make up the Xalan 
doc set, for example, we send the stylesheet an id parameter along with each XML 
source document. The id identifies that document and enables the stylesheet to 
integrate it into the overall doc set.</p>
  +<p>To set a stylesheet parameter, use the <jump 
href="apdidocs/class_xalantransformer.html">XalanTransformer</jump> 
setStylesheetParam() method. The setStytlesheetParam() method takes two arguments: the 
parameter name and the expression. For example:</p>
  +<source>const char* key="param1";
  +const char* expression="'Hello World'";
  +theXalanTransformer.setStylesheetParam(key, expression);
  +// foo.xsl defines a stylesheet parameter named param1.
  +theXalanTransformer.transform("foo.xml","foo.xsl","foo-out.xml")</source>
  +<note>If the expression is a string, enclose it in single quotes to make it a 
string expression.</note>
  +<p>You can include the -param flag with two arguments when you call the <link 
idref="commandline">command line utility</link>. The first argument is the parameter 
name or key, and the second argument is the string expression (in single quotes). For 
example:</p>
  +<p><code>TestXSLT -in foo.xml -xsl foo.xsl -param param1 'boo'</code></p>
  +<p>If the string expression includes spaces or other characters that the shell 
intercepts, first enclose the string in single quotes so &xslt4c; interprets it as a 
string expression, and then enclose the resulting string in double quotes so the shell 
interprets it as a single argument. For example:</p>
  +<p><code>TestXSLT -in foo.xml -xsl foo.xsl -param param1 "'hello there'"</code></p>
  +<p>The <link idref="samples" anchor="usestylesheetparam">UseStylesheetParam</link> 
sample application also uses a command-line parameter.</p>
  +</s2><anchor name="incremental"/>
  +<s2 title="Processing output incrementally">
  +<p><jump href="apdidocs/class_xalantransformer.html">XalanTransformer</jump> 
provides a transform() method that sends the output in blocks to a callback function, 
which enables you to begin processing the output while the transformation is still in 
process:</p>
   <source>int
  -transform(const char* xmlInFile,
  -          const char* xslFile,
  +transform(const XSLTInputSource&amp; xmlIn,
  +          const XSLTInputSource&amp; xslIn,
             const void* theOutputHandle,
             XalanOutputHandlerType theOutputHandler
             XalanFlushHanderType theFlushHandler = 0);</source>
  -<p>The transform() method that the other transform() methods all call:</p>
  -<source>int
  -transform( const XSLTInputSource&amp; xmlInput,
  -           const XSLTInputSource&amp; xslStylesheet,
  -           const XSLTResultTarget&amp; transformResult);</source>
  -                                            
  -</s3><anchor name="capi"/>
  -<s3 title="Basic XalanTransformer usage pattern with the C API">
  -<p>We also include a simple C interface for using the XalanTransformer class. See 
XalanTransformer/XalanCAPI.h in the source tree. 
  -The <link idref="samples" anchor="apachemodulexslt">ApacheModuleXSLT</link> sample 
illustrates the use of this C API.</p>
  -<p>Basic strategy:</p>
  -<ol>
  -  <li>Include the XalanTransformer C API header.<br/>
  -  <code>#include &lt;XalanTransformer/XalanCAPI.h&gt;</code><br/><br/></li>
  -  <li>Initialize Xalan and Xerces.<br/>
  -  <code>XalanInitialize();</code><br/><br/></li>  
  -  <li>Create a Xalan transformer.<br/>
  -  <code>XalanHandle xalan = NULL;</code><br/>
  -  <code>xalan = CreateXalanTransformer();</code><br/><br/></li>
  -  <li>Perform each transformation. For example:<br/>
  -  <code>char * xmlfilename = "foo.xml";</code><br/>
  -  <code>char xslfilename = "foo.xsl";</code><br/>
  -  <code>char outfilename = "foo.out";</code><br/>  
  -  <code>int theResult = 0;</code><br/>
  -  <code>theResult = XalanTransformToFile(xmlfilename,</code><br/>
  -  
<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xslfilename,</code><br/>
  -  
<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outfilename,</code><br/>
  -  
<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xalan);</code><br/><br/></li>
  -  <li>Shut down Xalan.<br/>
  -  <code>XalanTerminate();</code></li>
  -</ol>
  -<p>If the XML input file contains a stylesheet processing instruction that you want 
to use, include an empty string ("") for the xslfilename argument.</p>
  -</s3><anchor name="cvar"/>
  -<s3 title="Variations with the XalanTransformer C API">
  -<p>The C API supports basically the same options as the C++ API.</p>
  -<p>Transform from files to a character array:</p>
  -<source>int
  -XalanTransformToData(const char*  xmlInFile,
  -                     const char*  xslFile,
  -                     const char** transformOutput,
  -                     XalanHandle  xalan);</source>
  -<p>If the XML input contains a stylesheet processing instruction that you want to 
use, include an empty string ("") for the xslFile argument.</p>                     
  -<p>After calling XalanTransformToData(), call XalanFreeData() with the address of 
the pointer to the character array:</p>
  -<p><code>XalanFreeData(transformOutput);</code></p>
  -<p>Transform to a callback function that receives the output in blocks (see the 
<link idref="samples" 
  -anchor="apachemodulexslt">ApacheModuleXSLT</link> sample).</p>
  -<source>int
  -XalanTransformToHandler(const char*  xmlInFile,
  -                        const char*  xslFile,
  -                        XalanHandle xalan,
  -                        const void* outputHandle,
  -                        XalanOutputHandlerType outputHandler,
  -                        XalanFlushHandlerType flushHandler);</source>
  -</s3>
  -</s2><anchor name="basic"/>
  -<s2 title="Basic procedure for performing an XSL transformation">
  -<p>When you are setting up your application to use XSL stylesheets to transform XML 
documents, you must do the following:</p>
  -<s3 title="1. Include the required header files">
  -<p>Always start with Include/PlatformDefinitions.hpp, the &xslt4c; base header 
file. Along with any additional &xslt4c; and other header files that are required for 
the particular application, be sure to include utils/PlatformUtils.hpp from the 
&xml4c; distribution.</p>
  -</s3>
  -<s3 title="2. Initialize Xalan and Xerces">
  -<p>Use the static initializers to initialize the &xslt4c; and &xml4c; platforms. 
You must initialize &xml4c; once per process. You may
  -initialize and terminate &xslt4c; multiple times, but this is not recommended: it 
is inefficient and is not thread safe.</p>
  -<source>XMLPlatformUtils::Initialize();
  -XSLTInit  theInit;</source>
  -</s3><anchor name="step3"/>
  -<s3 title="3. Set up an XSLT processor with its support objects">
  -<p>The XSLT processor interacts with several support objects that you must set up 
before you can perform transformations.</p>
  -<source>// Create the support objects.
  -XalanSourceTreeDOMSupport      theDOMSupport;
  -XalanSourceTreeParserLiaison   theParserLiaison(theDOMSupport);
  -// Hook the two together...
  -theDOMSupport.setParserLiaison(&amp;theParserLiaison);
  -// More support objects...
  -XSLTProcessorEnvSupportDefault theXSLTProcessorEnvSupport;
  -XObjectFactoryDefault          theXObjectFactory;
  -XPathFactoryDefault            theXPathFactory;
  -
  -// Create the processor.
  -XSLTEngineImpl  theProcessor(
  -          theParserLiaison,
  -          theXSLTProcessorEnvSupport,
  -          theDOMSupport,
  -          theXObjectFactory,
  -          theXPathFactory);
  -
  -// Connect the processor to the environment support object.
  -theXSLTProcessorEnvSupport.setProcessor(&amp;theProcessor);</source>
  -</s3>
  -<s3 title="4. Create context objects for the stylesheet">
  -<p>Use the processor and support objects to set up stylesheet construction context 
and execution context objects.</p>
  -<source>
  -StylesheetConstructionContextDefault  theConstructionContext(
  -            theProcessor,
  -            theXSLTProcessorEnvSupport,
  -            theXPathFactory);
  -StylesheetExecutionContextDefault      theExecutionContext(
  -            theProcessor,
  -            theXSLTProcessorEnvSupport,
  -            theDOMSupport,
  -            theXObjectFactory);
  -            
  -// Optional: arrange to send parsing errors to the ProblemListener set 
  -// for XSLTEngineImpl.
  -theParserLiaison.setExecutionContext(theExecutionContext);</source>
  -</s3>
  -<s3 title="5. Set up input and output objects for a transformation">
  -<p>You must set up XSLTInputSource objects for the XML document and XSL stylesheet, 
and an XSLTResultTarget object to contain the transformation output.</p>
  -<p>Each of these objects may take the form of a file or URL, a stream, or a DOM 
tree. In the following fragment, the input and output are files:</p>
  -<source>// Use XalanDOMString to create a Unicode file name.
  -// The files are in the same directory as the application executable.
  -const XalanDOMString    theXMLFileName("foo.xml");
  -const XalanDOMString    theXSLFileName("foo.xsl");
  -
  -// Create XSLTInputSource objects.
  -XSLTInputSource    theInputSource(c_wstr(theXMLFileName));
  -XSLTInputSource    theStylesheetSource(c_wstr(theXSLFileName));
   
  -// For the output, create an XSLTResultTarget object.
  -const XalanDOMString    theOutputFile("foo.out");
  -XSLTResultTarget             theResultTarget(theOutputFile);
  -</source>
  -<p>For the other constructors you can use to set up input and output objects (with 
input and output streams, for example), see <jump 
href="apidocs/class_xsltinputsource.html">XSLTInputSource</jump> and <jump 
href="apidocs/class_xsltresulttarget.html">XSLTResultTarget</jump>. See also <link 
anchor="dom">Working with
  -DOM input and output</link>.</p>
  -</s3><anchor name="process"/>
  -<s3 title="6. Perform the transformation">
  -<p>Use the XSLTEngineImpl process() method to perform the transformation.</p>
  -<source>
  -theProcessor.process(
  -               theInputSource,
  -               theStylesheetSource,
  -               theResultTarget,
  -               theConstructionContext,
  -               theExecutionContext);</source>
  -<p>The XSLTResultTarget object receives the transformation output.</p>
  -<p>The support objects store running state information, so they are not thread 
safe. To perform multiple transformations, create a new instance for each 
transformation, or call the StylesheetExecutionContext reset() method between each 
transformation.</p> 
  -<p>If you are using the same stylesheet to perform multiple transformations, for 
efficiency you should compile the stylesheet and use the appropriate XSLTEngineImpl 
process() method. Compiled stylesheet (StylesheetRoot) objects are also thread-safe. A 
single StylesheetRoot object may be called concurrently from multiple threads. For 
more information, see <link anchor="compiled">Compiling stylesheets</link>.</p>
  -</s3>
  -<s3 title="7. Shut down Xerces.">
  -<p>When you are done performing transformations, shut down Xerces. Once you have 
shut down Xerces, you can no longer make Xalan or Xerces call in that process.</p>
  -<source>// Call the static terminator for Xerces.
  -XMLPlatformUtils::Terminate();
  -</source>
  -<p>For a sample application that performs a transformation, see <link 
idref="samples" anchor="simpletransform">SimpleTransform</link>.</p> 
  -</s3>
  +</s2><anchor name="compiled"/>
  +<s2 title="Performing a series of transformations">
  +<p>Before Xalan performs a standard transformation, it must parse the XML document 
and compile the XSL stylesheet into binary representations. If you plan to use the 
same XML document or stylesheet in a series of transformations, you can improve 
performance by parsing the XML document or compiling the styleheet once and using the 
binary representation when you call transform().</p>
  +<p><jump href="apdidocs/class_xalantransformer.html">XalanTransformer</jump> 
includes methods for creating compiled stylesheets and parsed XML documents: the 
compileStylesheet() method returns a pointer to a <jump 
href="apdidocs/class_xalancompiledstylesheet.html">XalanCompiledStylesheet</jump>; the 
parseSource() method returns a pointer to a <jump 
href="apdidocs/class_xalanparsedsource.html">XalanParsedSource</jump>.</p>
  +<note>In the case of failure, both methods return 0.</note>
  +<p>Example using a XalanCompiledStylesheet to perform multiple transformations:</p>
  +<source>XalanCompiledStylesheet* compiledStylesheet = 0;
  +compiledStylesheet = theXalanTransformer.compileStylesheet("foo.xsl");
  +assert(compiledStylesheet!=0);
  +theXalanTransformer.transform("foo1.xml", *compiledStylesheet, "foo1.out.");
  +theXalanTransformer.transform("foo2.xml", *compiledStylesheet, "foo2.out");
  +...</source>
  +<p>For a working sample, see the <link idref="samples" 
anchor="compilestylesheet">CompileStylesheet</link> sample.</p>
  +<p>Example using a XalanParsedSource for multiple transformations:</p>
  +<source>XalanParsedSource* parsedXML = 0;
  +parsedXML = theXalanTransformer.parseSource("foo.xml");
  +assert(parsedXML!=0);
  +theXalanTransformer.transform(*parsedXML, "foo1.xsl", "foo-xsl1.out");
  +theXalanTransformer.transform(*parsedXML, "foo2.xsl", "foo-xsl2.out");
  +...</source>
  +<p>For a sample that uses both a parsed XML source and a compiled stylesheet, see 
<link idref="samples" anchor="threadsafe">ThreadSafe</link>.</p>
   </s2><anchor name="dom"/>
   <s2 title="Working with DOM input and output">
  -<p>You can set up an XSLTResultTarget to produce a DOM when you perform a 
transformation. You can also use a DOM as input for a transformation.</p>
  +<p>You can set up an <jump 
href="apidocs/class_xsltresulttarget.html">XSLTResultTarget</jump> to produce a DOM 
when you perform a transformation. You can also use a DOM as input for a 
transformation.</p>
   <p>The following code fragments illustrate the procedures for working with DOM 
input and output:</p>
   <source>
   
  @@ -321,94 +221,6 @@
   // the output.
   // You can also convert the XalanDocument to a Xerces DOM_Document.
   DOM_Document domOut = theParserLiaison.mapXercesDocument(docOut)</source>
  -</s2><anchor name="params"/>
  -<s2 title="Setting stylesheet parameters">
  -<p>An XSL stylesheet can include parameters that are set at run time before a 
transformation takes place. When we generate the HTML documents that make up the Xalan 
doc set, for example, we send the stylesheet an id parameter along with each XML 
source document. The id identifies that document and enables the stylesheet to 
integrate it into the overall doc set.</p>
  -<p>To set a stylesheet parameter, use one of the <jump 
href="apidocs/class_xsltengineimpl.html">XSLTEngineImpl</jump> setStylesheetParam() 
methods. Both methods take two arguments: the parameter name (a XalanDOMstring) and 
the expression (a XalanDOMString or an XObject). The XObject option is useful when you 
are working with the XPath API. For example, you could use the XObject returned by an 
Xpath function to set a stylesheet parameter.</p>
  -<note>If the expression is a string and you are using XalanDOMString for the input 
parameter, enclose it in single quotes to make it a string expression.</note>
  -<p>You can include the -param flag with two arguments when you call the <link 
idref="commandline">command line utility</link>. The first argument is the parameter 
name or key, and the second argument is the string expression (in single quotes). For 
example:</p>
  -<p><code>TestXSLT -in foo.xml -xsl foo.xsl -param param1 'boo'</code></p>
  -<p>If the string expression includes spaces or other characters that the shell 
intercepts, first enclose the string in single quotes so &xslt4c; interprets it as a 
string expression, and then enclose the resulting string in double quotes so the shell 
interprets it as a single argument. For example:</p>
  -<p><code>TestXSLT -in foo.xml -xsl foo.xsl -param param1 "'hello there'"</code></p>
  -<p>The <link idref="samples" anchor="usestylesheetparam">UseStylesheetParam</link> 
sample application also uses a command-line parameter.</p>
  -</s2><anchor name="compiled"/>
  -<s2 title="Compiling stylesheets">
  -<p>When &xslt4c; performs a transformation with the <link 
anchor="process">XSLTEngineImpl process() method used above</link>, it starts by 
compiling the stylesheet into a binary representation. If you intend to use the same 
stylesheet to perform multiple transformations, you can enhance efficiency by 
explicitly compiling the stylesheet and using another XSLTEngimeImpl process() method 
for each transformation. A compiled stylesheet (a <jump 
href="apidocs/class_stylesheetroot.html">StylesheetRoot</jump> object) is thread safe, 
so it even supports concurrent access by multiple clients. If, for example, you are 
setting up a server application to perform transformations, you can improve 
performance by compiling any stylesheets the application repeatedly uses.</p>
  -<p>A compiled stylesheet requires its own XPath factory support object, independent 
of the XPath support object for an XSLT processor. So after you have set up the XSLT 
processor with its support objects, set up another XPath
  -factory support object and use it to create a construction context for the 
stylesheet:</p>
  -<source>// Set up the XSLT processor with its support objects
  -XercesDOMSupport           theDOMSupport;
  -XercesParserLiaison        theParserLiaison(theDOMSupport);
  -XPathSupportDefault        theXPathSupport(theDOMSupport);
  -XSLTProcessorEnvSupportDefault  theXSLTProcessorEnvSupport;
  -XObjectFactoryDefault      theXObjectFactory;
  -XPathFactoryDefault        theXPathFactory;
  -
  -// Create the processor and connect to the
  -// environment support object.
  -XSLTEngineImpl  theProcessor(
  -          theParserLiaison,
  -          theXPathSupport,
  -          theXSLTProcessorEnvSupport,
  -          theDOMSupport;
  -          theXObjectFactory,
  -          theXPathFactory);
  -theXSLTProcessorEnvSupport.setProcessor(&amp;theProcessor);
  -...
  -// Create an XPath factory support object for the stylesheet,
  -// so it will have its own factory-created XPath instances
  -// (separate from the XSLT processor XPath objects).
  -XPathFactoryDefault        theStylesheetXPathFactory;
  -
  -// Use this XPath factory support object to create a stylesheet 
  -// construction context.
  -StylesheetConstructionContextDefault  theConstructionContext(
  -            theProcessor,
  -            theXSLTProcessorEnvSupport,
  -            theStylesheetXPathFactory);
  -
  - // The execution context uses the same factory support objects as
  - // the processor.
  - StylesheetExecutionContextDefault    theExecutionContext(
  -            theProcessor,
  -            theXSLTProcessorEnvSupport,
  -            theXPathSupport,
  -            theXObjectFactory);</source>
  -<p>Compile the stylesheet, add the StylesheetRoot object to the execution context, 
and start performing transformations. Use the XSLTEngineImpl process() method (see 
below) that takes advantage of the compiled stylesheet. Be sure to reset the processor 
and execution context between each transformation. For example:</p>
  -<source>
  -// Compile the stylesheet.
  -StylesheetRoot* const        theStylesheetRoot =
  -          theProcessor.processStylesheet(
  -                theStylesheetSource,
  -                theConstructionContext);
  -          assert(theStylesheetRoot != 0);
  -
  -// Set the execution context object to use the compiled stylesheet.
  -theExecutionContext.setStylesheetRoot(theStylesheetRoot)
  -
  -// Set up an XSLTInputSource object (theInputSource)
  -// and an XSLTResultTarget object (theResultTarget).
  -...
  -// Do the transformation. This version of the process() method uses
  -// the StylesheetRoot object associated with the execution context.
  -theProcessor.process(
  -         theInputSource,
  -         theResultTarget,
  -         theExecutionContext);
  -
  -// Reset the processor and the execution context
  -// so we can perform the next transformation.
  -// Reset the parser liaison to clear out the
  -// source document we just transformed.
  -
  -theProcessor.reset();
  -theExecutionContext.reset();
  -theParserLiaison.reset();
  -theExecutionContext.setStylesheetRoot(theStylesheetRoot);
  -
  -// Perform the next transformation.
  -....</source>
  -<p>For an example, see the <link idref="samples" 
anchor="compilestylesheet">CompileStylesheet</link> sample.</p>
   </s2><anchor name="xpath"/>
   <s2 title="Working with XPath expressions">
   <p>XSL stylesheets use XPath expressions to select nodes, specify conditions, and 
generate text for the result tree. XPath provides an API that you can call directly. 
For example, you may want to select nodes programmatically and do your own processing 
without a stylesheet.</p>
  @@ -498,6 +310,47 @@
   // and install the ICUCollationCompareFunctor.
   ICUBridgeCollationCompareFunctor     theICUFunctor;
   theExecutionContext.installCollationCompareFunctor(&amp;theICUFunctor);</source>
  + </s3></s2><anchor name="capi"/>
  + <s2 title="Basic XalanTransformer usage pattern with the C API">
  +<p>We also include a simple C interface for using the XalanTransformer class. See 
XalanTransformer/XalanCAPI.h in the source tree. 
  +The <link idref="samples" anchor="apachemodulexslt">ApacheModuleXSLT</link> sample 
illustrates the use of this C API.</p>
  +<p>Basic strategy:</p>
  +
  +  <s3 title="1. Include the XalanTransformer C API header">
  +  <source>#include &lt;XalanTransformer/XalanCAPI.h&gt;</source>
  +  </s3>
  +  <s3 title="2. Initialize Xalan and Xerces">
  +  <source>XalanInitialize();</source> 
     </s3>
  - </s2>
  +  <s3 title="3. Create a Xalan transformer">
  +  <source>XalanHandle xalan = NULL;
  +xalan = CreateXalanTransformer();</source>
  +</s3>
  +  <s3 title="4. Perform each transformation">
  +<p>  For example:</p>
  +<source>const char * xmlfilename = "foo.xml";
  +const char* xslfilename = "foo.xsl";
  +const char* outfilename = "foo.out";
  +int theResult = 0;
  +theResult = XalanTransformToFile(xmlfilename,
  +                                 xslfilename,
  +                                 outfilename,
  +                                 xalan);</source>
  +<note>If the XML input file contains a stylesheet processing instruction that you 
want to use, include an empty string ("") for the xslfilename argument.</note>
  +</s3>                                 
  +  <s3 title="5. Shut down Xalan">
  +  <source>XalanTerminate();</source>
  +</s3></s2><anchor name="cvar"/>
  +<s2 title="Variations with the XalanTransformer C API">
  +<p>The <jump href="apidocs/XalanCAPI.h.html">Xalan C API</jump> supports 
approximately the same set of options as the C++ API. In particular, you can</p>
  +<ul>
  +<li>Use stylesheet processing instructions (PI) to supply the stylesheet. Simply 
supply an empty string ("") for the XSL file name.<br/><br/></li>
  +<li>Set stylesheet parameters. Use the SetStylesheetParam() method.<br/><br/></li>
  +<li>Compile stylesheets. Use the CompileStylesheet() method to compile a 
stylesheet, and the TransformToFileCSS() or TransformToDataCSS() method to use the 
compiled stylesheet in a transformation.<br/><br/></li>
  +<li>Parse XML sources. Use the XalanParseSource() or XalanParseSouceUseXalan() 
method.<br/><br/></li>
  +<li>Place the transformation output in a character array. Use the TransformToData() 
or TransformToDataCSS() method. After you perform the transformation, use the 
XalanFreeData() method to free memory allocated for the output data.<br/><br/></li>
  +<li>Send the output to a callback function to process blocks of output data as they 
arrive.</li>
  +</ul> 
  +<p>For a sample that sends output in blocks to a callback function, see <link 
idref="samples" anchor="apachemodulexslt">ApacheModuleXSLT</link>.</p>
  +</s2>
   </s1>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to