blob: e3f5c54ef84b76106e361938d20a4ecc11defaa6 [file] [log] [blame] [view]
# Xalan-C++ Samples
## Samples to help you get started
Each of the subdirectories in the Xalan-C++
[*samples*](https://github.com/apache/xalan-c/tree/master/samples)
directory contains the source files for a sample application.
With most of the samples, you can use the following procedure:
1. Go to the samples subdirectory containing the sample (use the CMD
shell or PowerShell if you are running Windows)
2. Run the sample from the command line (as indicated below)
3. Examine the application source files. You may also want to modify
the source files. Remember that if you modify a *.cpp* file, you
must rebuild the executable and place it on the path before you can
run the modified application.
Note: Each sample application looks for input files in the current
directory, the directory from which you run the application. The
input files are in the samples subdirectory along with the sample
source files. The location of the sample executables may vary
depending upon the CMake generator used for building. They should
typically be located within the *builddir/samples/\<sample\>*. In all
cases, be sure the sample executable is on the `PATH`, and run it
from the samples subdirectory that contains the input files.
Note: The most of the samples are implemented without providing a
pluggable memory manager. [SimpleTransform](#simpletransform)
sample illustrates, in addition to a simple transformation, the usage
of the processor with memory manager.
## ApacheModuleXSLT
Note: This sample must be built with the Apache Web server.
What it does: runs as an Apache module on an Apache Web server;
performs transformations and returns the output to a Web browser. You
configure Apache to respond to a given URL request for an output file
(html or txt file in the configuration below) by applying an XSL
stylesheet file to an XML document file (both with the specified name
in a given location) and returning the transformation output to the
client.
This sample also illustrates use of the
[`XalanTransformer`](https://apache.github.io/xalan-c/api/classxalanc_1_1XalanTransformer.html)
class and the C API defined in
[*xalanc/XalanTransformer/XalanCAPI.h*](https://apache.github.io/xalan-c/api/XalanCAPI_8h.html#ab9ec00bf3fbe6a946e20418a53891755).
It returns transformation output in blocks to a callback function,
which enables the browser to start displaying the result before the
transformation has been completed.
Note: You may need to configure CMake to locate the required Apache
header files.
### Setting up and using ApacheModuleXSLT
To use `ApacheModuleXSLT`, do the following:
1. (UNIX only) Be sure the Xalan and Xerces libraries are on your
system library path, and copy the Apache module to */usr/lib/apache*.
2. Add `LoadModule` and (UNIX only) `AddModule` entries to the Apache
configuration file, *httpd.conf*.
Windows: `LoadModule xslt_module Xalan-C_1_12_0;-<my_Windows_distribution>\bin\ApacheModuleXSLT.dll`
UNIX: `AddModule mod_xslt.c` and
`LoadModule xslt_module /usr/lib/apache/mod_xslt.<ref>xx</ref>`
where `<ref>xx</ref>` is the appropriate library suffix for the
UNIX platform ("*.so*" or "*.a*").
3. Add a `<Location>` entry to `httpd.conf` that indicates where
*.xml* and *.xsl* file pairs are to be found, and what target file
extensions to recognize. We suggest the following:
```xml
<Location /xslt>
AddHandler mod_xslt .html
AddHandler mod_xslt .txt
</Location>
```
This <Location> element instructs the module to respond to requests
for *xxx.html* and *xxx.txt* files in the in the *xslt* subdirectory
(under the document root; see next item) by applying the *xxx.xsl*
stylesheet to *xxx.xml* (both in that directory) and returning the
transformation result to the browser.<br>
For example, a request for *foo.html* instructs the module to apply
*foo.xsl* to *foo.xml* and return the result.<br>
Note: It is up to the stylesheet to apply the appropriate
`xsl:output` method to the output. Whether the user specifies
`html` or `txt` is, of itself, immaterial.
4. Put *.xml* and *.xsl* file pairs in the `<Location>` subdirectory
(*xslt* in the example) under the document root directory specified
in *httpd.conf* by the `DocumentRoot` and `<Directory>` settings.
Alternatively, you can modify these settings to point to
*samples/ApacheModuleXSLT*, which includes an *xslt* subdirectory
with *.xml* and *.xsl* file pairs (*foo.xml* and *foo.xsl*,
*apachemod.xml* and *apachemod.xsl*).
5. Start the Apache server.
6. From a Web browser, call the module with a URL as follows:
`http://serverName/xslt/xxx.html`
where `serverName` is the Apache server (such as `www.myServer.com`)
and `xxx` is the name of an XML/XSL pair of files (such as *foo.xml*
and *foo.xsl*) in the *xslt* subdirectory under the `DocumentRoot`
directory.<br>
For example, `http://www.myServer.com/xslt/apachemod.html`
instructs `ApacheModuleXSLT` to apply the *apachemod.xsl* stylesheet
to the *apachemod.xml* XML document (both files in the *xslt*
directory under the Apache `DocumentRoot` directory) and return the
transformation result to the browser.
## CompileStylesheet
What it does: Use a compiled stylesheet to perform a series of
transformations.
You can run it from the *CompileStylesheet* subdirectory with
`CompileStylesheet`
See also:
[Performing a series of transformations](usagepatterns.md#performing-a-series-of-transformations).
## DocumentBuilder
What it does: Use a `DocumentBuilder` to programmatically construct an
XML document, apply the *foo.xsl* stylesheet to this document, and
write the ouput to *foo.out*.
You can run it from the *DocumentBuilder* subdirectory with
`DocumentBuilder`.
## ExternalFunction
What it does: implement, install, and illustrate the usage of three
extension functions. The functions return a square root, a cube, and a
string with the current date and time. The sample stylesheet
(*foo.xsl*) gets the area of a cube and units of measurement from an
XML document (*foo.xml*), computes the length of each side of a cube
and the volume of the cube, and enters the date and time of the
transformation. The output appears in *foo.out*.
Run this sample from the *ExternalFunction* subdirectory with
`ExternalFunction`.
See also: [Extension Functions](faq.md#extension-functions).
## ParsedSourceWrappers
What it does: performs a transformation with input in the form of a
pre-built `XercesDOM` or `XalanSourceTree`.
Run this sample from the *ParsedSourceWrappers* subdirectory with
`ParsedSourceWrappers`
See `transformXercesDOM()` and `transformXalanSourceTree()` as called
by `transform()` in *ParsedSourceWrappers.cpp*.
## SerializeNodeSet
What it does: Serialize the node set returned by the application of an
XPath expression to an XML document.
Run this sample from the *SerializeNodeSet* subdirectory with
```sh
SerializeNodeSet XMLFile ContextNode XPathExpression
```
where *XMLFile* is an XML source file, *ContextNode* is the location
path to the context node, and *XPathExpression* is an XPath expression
to apply to that context node. The *SerializeNodeSet* directory
contains the same *foo.xml* sample source file as the preceding
examples.
## SimpleTransform
What it does: The `SimpleTransform` class uses the *foo.xsl* stylesheet
to transform *foo.xml*, and writes the output to *foo.out*. The source
for this sample has been modified to demonstrate the usage of the new
pluggable memory management feature.
You can run it from the *SimpleTransform* subdirectory with
`SimpleTransform`.
See also:
[Basic procedures for performing XSL transformations](usagepatterns.md#xalan-c-basic-usage-patterns).
## SimpleXPathAPI
What it does: Use the `XPathEvaluator` interface to evaluate an XPath
expression from the specified context node of an XML file and display
the nodeset returned by the expression.
Note: You can use this sample as an aid when you want to find out what
a given XPath expression returns from a given context node in an XML
file.
Run this sample from the *SimpleXPathAPI* subdirectory with:
```sh
SimpleXPathAPI XMLFile ContextNode XPathExpression
```
where *XMLFile* is an XML source file, *ContextNode* is the location
path to the context node, and *XPathExpression* is an XPath expression
to apply to that context node.
Keep in mind that the string value returned by an XPath expression is
the string value of the first node in the nodeset returned by the
expresssion.
The *XPathWrapper* subdirectory contains an XML file named *xml.foo*
(part of it appears below).
```xml
<?xml version="1.0"?>
<doc>
<name first="David" last="Marston">Mr. Marson</name>
<name first="David" last="Bertoni">Mr. Bertoni</name>
<name first="Paul" last="Dick">Mr. Dick</name>
</doc>
```
You can try command lines like
```sh
SimpleXPathAPI foo.xml /foo:doc foo:name/@last
```
and
```sh
SimpleXPathAPI foo.xml / '//foo:name[position()="4"]/@first'
```
Note: If a `SimpleXPathAPI` argument includes characters (such as `*`)
that the shell interprets incorrectly, enclose the argument in double
quotes.
See also:
[Working with XPath expressions](usagepatterns.md#working-with-xpath-expressions).
## SimpleXPathCAPI
What it does: Use the
[`XPathEvaluator`](https://apache.github.io/xalan-c/api/classxalanc_1_1XPathEvaluator.html)
C interface to evaluate an XPath expression and display the string
value returned by the expression.
Note: Keep in mind that the string value returned by an XPath
expression is the string value of the first node in the nodeset
returned by the expresssion.
Run this sample from the *SimpleXPathCAPI* subdirectory with:
```sh
SimpleXPathCAPI XMLFile XPathExpression
```
where *XMLFile* is an XML source file, and *XPathExpression* is an
XPath expression to apply to the XML source file. The
*SimpleXPathCAPI* subdirectory contains an XML file named *foo.xml*
similar to the *foo.xml* in the preceding example.
You can try command lines like:
```sh
SimpleXPathCAPI foo.xml /doc/name[3]
```
## StreamTransform
What it does: The `StreamTransform` class processes character input
streams containing a stylesheet and an XML document, and writes the
transformation output to a character output stream. This sample
illustrates the process for working with stylesheets and documents
that you assemble in memory.
You can run it from the *SimpleTransform* subdirectory with `StreamTransform`.
## ThreadSafe
What it does: Multiple threads use a single compiled stylesheet
(`StylesheetRoot`) and DOM source tree (`XalanNode`) to perform
transformations concurrently. The application tracks the progress of
the threads in messages to the console, and each thread writes its own
output file. Imagine a server application responding to multiple
clients who happen to request the same transformation.
You can run it from the *ThreadSafe* subdirectory with `ThreadSafe`.
See also:
[Performing a series of transformations](usagepatterns.md#performing-a-series-of-transformations).
## TraceListen
What it does: Trace events during a transformation; the transformation
uses *birds.xsl* to transform *birds.xml* and writes the output to
*birds.out*.
You can run it from the *TraceListen* subdirectory with:
```sh
TraceListen traceFlags
```
where `traceFlags` is one or more of the following:
* *-tt* (Trace the templates as they are being called)
* *-tg* (Trace each result tree generation event)
* *-ts* (Trace each selection event)
* *-ttc* (Trace the template children as they are being processed)
These flags are also available in the
[command-line utility (TestXSLT)](commandline.md).
The core of this example is the following fragment:
```c++
// Set up a diagnostic writer to be used by the TraceListener…
XalanStdOutputStream theStdErr(cerr);
XalanOutputStreamPrintWriter diagnosticsWriter(theStdErr);
// Make sure that error reporting, which includes any TraceListener
// output does not throw exceptions when transcoding, since that could
// result in an exception being thrown while another exception is active.
// In particular, characters that the TraceListener writes might not be
// representable in the local code page.
theStdErr.setThrowTranscodeException(false);
// Set up the TraceListener…
// traceTemplates, traceTemplateChildren, traceGenerationEvent,
// and TraceSelectionEvent are booleans set by the command line.
TraceListenerDefault theTraceListener(
diagnosticsWriter,
traceTemplates,
traceTemplateChildren,
traceGenerationEvent,
traceSelectionEvent);
// Add the TraceListener to the XSLT processor…
theProcessor.setTraceSelects(traceSelectionEvent);
theProcessor.addTraceListener(&theTraceListener);
// Perform the transformation
```
## TransformToXercesDOM
What it does: Performs a simple transformation but puts the result in a
Xerces `DOMDocument`
Run this sample from the *TransformToXercesDOM* subdirectory with:
```sh
TransformToXercesDOM XMLFile XSLFile
```
where *XMLFile* is a source XML file, and *XSLFile* is the XSLT input
file. The program will use *XSLFile* to transform the input file
*XMLFile* using Xerces DOM as the output destination.
See the `FormatterToXercesDOM` usage in the sample code.
## UseStylesheetParam
What it does: Performs a transformation using top-level stylesheet
parameters. There are three supported types of parameters. One is a
text string. A second is a number of type double. A nodeset or
parsed document can also be used.
You can run it from the *UseStylesheetParam* subdirectory with:
```sh
UseStylesheetParam xmlfile stylesheet outfile [options]
```
where the options are:
* *-s key "'String-Value'"*
* *-n key Number*
* *-d key "Document-URL"*
The files used by the sample program and the top-level parameter
nodesets for this illustration are to be in working directory in which
the sample program runs.
Using the sample program:
```sh
UseStylesheetParam foo.xml foo.xslt foo.out \
-s stringA "'This is a test string value'" \
-n numberA 123.012345 \
-d parmA "parmA.xml" \
-d parmB "parmB.xml"
```
The `parmA.xml` and `parmB.xml` files are parsed and converted to
nodesets. The stylesheet *foo.xslt* merges the contents of *foo.xml*
and the parameters into the *foo.out* file.
The source sample is implemented in C++. Another example is
implemented in 'C' using the XalanCAPI library, *TestCAPIparm.c*. The
usage interface for both is the same.
See also:
[Setting stylesheet parameters](usagepatterns.md#setting-stylesheet-parameters).
## XalanTransform
What it does: `XalanTransform` uses the
[`XalanTransformer`](https://apache.github.io/xalan-c/api/classxalanc_1_1XalanTransformer.html)
class and the associated C++ API to apply an XSL stylesheet file to an
XML document file and write the transformation output to either an
output file or to a stream.
`XalanTransform` takes command-line arguments for the XML document to
be transformed, the XSL stylesheet to apply, and an optional output
file argument. If you omit the third argument, `XalanTransform` writes
the transformation output to a stream that is sent to standard out (the
console).
You can run `XalanTransform` from the *XalanTransform* subdirectory
with:
```sh
XalanTransform foo.xml foo.xsl foo.out
```
Omit the third argument to write the transformation result to the
console.
See also:
[Using the XalanTransformer class](usagepatterns.md#performing-a-series-of-transformations).
## XalanTransformerCallback
What it does: Return transformation output in blocks to a callback
function, which writes the output to a file. This sample illustrates
the use of a callback function to incrementally process a
transformation result, that is to begin working with the transformation
result before the transformation has been completed. See
[Processing output incrementally](usagepatterns.md#processing-output-incrementally).
You can run it from the *XalanTransformerCallback* subdirectory with:
```sh
XalanTransformerCallback foo.xml foo.xsl [foo.out]
```
Note: If you omit the third argument, the transformation result is
written to the console.