SAXONICA

Saxon Documentation
Full Contents
About Saxon
Changes in this Release
Conditions of Use
Using XSLT 2.0
Using XQuery
Handling Source Documents
| Handling Source Documents
| Source Documents on the Command Line
| Collections
| Building a Source Document from an application
» | Writing input filters
| XInclude processing
| Saxon and XML 1.1
| JAXP Source Types
| Third-party Object Models: DOM, JDOM, XOM, and DOM4J
| Choosing a Tree Model
| The PTree File Format
| Validation of Source Documents
| Whitespace Stripping in Source Documents
| Streaming of Large Documents
XML Schema Processing
XPath API for Java
Saxon on .NET
Extensibility
Saxon Extensions
Sample Saxon Applications
The Saxon SQL Extension
XSLT Elements
XPath 2.0 Expression Syntax
Function Library
Standards Conformance

# Writing input filters

Saxon can take its input from a JAXP `SAXSource` object, which essentially represents a sequence of SAX events representing the output of an XML parser. A very useful technique is to interpose a filter between the parser and Saxon. The filter will typically be an instance of the SAX2 XMLFilter class.

There are a number of ways of using a Saxon XSLT transformation as part of a pipeline of filters. Some of these techniques also work with XQuery. The techniques include:

- Generate the transformation as an `XMLFilter` using the `newXMLFilter()` method of the `TransformerFactory`. This works with XSLT only. A drawback of this approach is that it is not possible to supply parameters to the transformation using standard JAXP facilities. It is possible, however, by casting the `XMLFilter` to a `net.sf.saxon.Filter`, and calling its `getTransformer()` method, which returns a `Transformer` object offering the usual `addParameter()` method.

- Generate the transformation as a SAX `ContentHandler` using the `newTransformerHandler()` method. The pipelines stages after the transformation can be added by giving the transformation a `SAXResult` as its destination. This again is XSLT only.

- Implement the pipeline step before the transformation or query as an `XMLFilter`, and use this as the `XMLReader` part of a `SAXSource`, pretending to be an XML parser. This technique works with both XSLT and XQuery, and it can even be used from the command line, by nominating the `XMLFilter` as the source parser using the `-x` option on the command line.

The `-x` option on the Saxon command line specifies the parser that Saxon will use to process the source files. This class must implement the SAX2 XMLReader interface, but it is not required to be a real XML parser; it can take the input from any kind of source file, so long as it presents it in the form of a stream of SAX events. When using the JAXP API, the equivalent to the `-x` option is to call `transformerFactory.setAttribute( net.sf.saxon.FeatureKeys.SOURCE_PARSER_CLASS, 'com.example.package.Parser')`

Next