public class XsltCompiler
extends java.lang.Object
To construct an XsltCompiler, use the factory method Processor.newXsltCompiler()
on the Processor object.
An XsltCompiler may be used repeatedly to compile multiple queries. Any changes made to the XsltCompiler (that is, to the static context) do not affect queries that have already been compiled. An XsltCompiler may in principle be used concurrently in multiple threads, but in practice this is best avoided because all instances will share the same ErrorListener and it may therefore be difficult to establish which error messages are associated with each compilation.
If JIT compilation is enabled (this is the default for Saxon-EE), then static errors in template
rules might be detected not during execution of the compile()
method, but rather
when the relevant code is first executed. In this situation the compile()
method will
not throw an exception, but the errors will still (eventually) be notified to the ErrorListener
associated with the compiler.
To avoid problems with error reporting, it is recommended that:
XsltCompiler
should be created for each compilation (and JIT should preferably
be disabled, so that all static errors are detected.)XsltCompiler
for all compilations, and to
enable JIT for maximum performance.Modifier | Constructor and Description |
---|---|
protected |
XsltCompiler(Processor processor)
Protected constructor.
|
Modifier and Type | Method and Description |
---|---|
java.lang.Iterable<XsltPackage> |
addCompilePackages(java.lang.Iterable<javax.xml.transform.Source> sources,
boolean link)
Deprecated.
since 9.8. Multiple packages may be supplied in the form of a
PackageLibrary registered
with the underlying CompilerInfo , or may be listed in the configuration file. Alternatively they
can be imported explicitly (taking care over the order of importing) using importPackage(XsltPackage) . |
void |
clearParameters()
Clear the values of all stylesheet parameters previously set using
setParameter(QName, XdmValue) . |
XsltExecutable |
compile(javax.xml.transform.Source source)
Compile a stylesheet.
|
XsltPackage |
compilePackage(javax.xml.transform.Source source)
Compile a library package.
|
java.lang.Iterable<XsltPackage> |
compilePackages(java.lang.Iterable<javax.xml.transform.Source> sources)
Deprecated.
since 9.8. Multiple packages may be supplied in the form of a
PackageLibrary registered
with the underlying CompilerInfo , or may be listed in the configuration file. Alternatively they
can be imported explicitly (taking care over the order of importing) using importPackage(XsltPackage) . |
void |
declareDefaultCollation(java.lang.String uri)
Declare the default collation
|
javax.xml.transform.Source |
getAssociatedStylesheet(javax.xml.transform.Source source,
java.lang.String media,
java.lang.String title,
java.lang.String charset)
Get the stylesheet associated
via the xml-stylesheet processing instruction (see
http://www.w3.org/TR/xml-stylesheet/) with the document
document specified in the source parameter, and that match
the given criteria.
|
java.lang.String |
getDefaultCollation()
Get the default collation
|
javax.xml.transform.ErrorListener |
getErrorListener()
Get the ErrorListener being used during this compilation episode
|
Processor |
getProcessor()
Get the Processor from which this XsltCompiler was constructed
|
java.lang.String |
getTargetEdition()
Get the target edition under which the stylesheet will be executed.
|
CompilerInfo |
getUnderlyingCompilerInfo()
Get the underlying
CompilerInfo object, which provides more detailed (but less stable) control
over some compilation options |
javax.xml.transform.URIResolver |
getURIResolver()
Get the URIResolver to be used during stylesheet compilation.
|
java.lang.String |
getXsltLanguageVersion()
Get the XSLT (and XPath) language level supported by the processor.
|
void |
importPackage(XsltPackage thePackage)
Import a library package.
|
void |
importPackage(XsltPackage thePackage,
java.lang.String packageName,
java.lang.String version)
Import a library package, changing the package name and/or version.
|
void |
importXQueryEnvironment(XQueryCompiler queryCompiler)
Import a compiled XQuery library.
|
boolean |
isAssertionsEnabled()
Ask whether assertions (xsl:assert instructions) should be enabled.
|
boolean |
isCompileWithTracing()
Ask whether trace hooks are included in the compiled code.
|
boolean |
isFastCompilation()
Ask if fast compilation has been enabled.
|
boolean |
isGenerateByteCode()
Ask whether bytecode is to be generated in the compiled code.
|
boolean |
isJustInTimeCompilation()
Ask whether just-in-time compilation of template rules should be used.
|
boolean |
isRelocatable()
Ask whether any package produced by this compiler can be deployed to a different location, with a different base URI
|
boolean |
isSchemaAware()
Ask whether schema-awareness has been requested by means of a call on
setSchemaAware(boolean) |
XsltExecutable |
loadExecutablePackage(java.net.URI location)
Load a compiled package from a file or from a remote location, with the intent to use this as a complete
executable stylesheet, not as a library package.
|
XsltPackage |
loadLibraryPackage(java.net.URI location)
Load a compiled package from a file or from a remote location.
|
XsltPackage |
obtainPackage(java.lang.String packageName,
java.lang.String versionRange)
Import a named package, together with all the packages on which it depends, recursively.
|
XsltPackage |
obtainPackageWithAlias(java.lang.String alias)
Import a package from the configuration file (or more generally, from the packageLibrary
of this XsltCompiler) given an alias used to identify it
|
void |
setAssertionsEnabled(boolean enabled)
Say whether assertions (xsl:assert instructions) should be enabled.
|
void |
setCompileWithTracing(boolean option)
Set whether trace hooks are to be included in the compiled code.
|
void |
setErrorList(java.util.List<StaticError> errorList)
Supply a (typically empty)
List which will be populated with information about any static errors
encountered during the transformation. |
void |
setErrorListener(javax.xml.transform.ErrorListener listener)
Set the ErrorListener to be used during this compilation episode
|
void |
setFastCompilation(boolean fast)
Request fast compilation.
|
void |
setGenerateByteCode(boolean option)
Set whether bytecode should be generated for the compiled stylesheet.
|
void |
setJustInTimeCompilation(boolean jit)
Say whether just-in-time compilation of template rules should be used.
|
void |
setParameter(QName name,
XdmValue value)
Set the value of a stylesheet parameter.
|
void |
setRelocatable(boolean relocatable)
Say whether any package produced by this compiler can be deployed to a different location, with a different base URI
|
void |
setSchemaAware(boolean schemaAware)
Say that the stylesheet must be compiled to be schema-aware, even if it contains no
xsl:import-schema declarations.
|
void |
setTargetEdition(java.lang.String edition)
Set the target edition under which the stylesheet will be executed.
|
void |
setURIResolver(javax.xml.transform.URIResolver resolver)
Set the URIResolver to be used during stylesheet compilation.
|
void |
setXsltLanguageVersion(java.lang.String version)
Deprecated.
Has no effect from Saxon 9.8.
|
protected XsltCompiler(Processor processor)
Processor.newXsltCompiler()
.processor
- the Saxon processorpublic Processor getProcessor()
public void setURIResolver(javax.xml.transform.URIResolver resolver)
Source
representing the
location where a stylesheet module can be found.
This URIResolver is used to dereference the URIs appearing in xsl:import
,
xsl:include
, and xsl:import-schema
declarations. It is not used
for resolving the URI supplied for the main stylesheet module (as supplied to the
compile(javax.xml.transform.Source)
or compilePackage(javax.xml.transform.Source)
methods.
It is not used at run-time for resolving requests to the document()
or similar functions.
(Instead, such functions use the run-time URIResolver passed to the XsltTransformer
or Xslt30Transformer
).
resolver
- the URIResolver to be used during stylesheet compilation.public void setParameter(QName name, XdmValue value)
name
- the qualified name identifying the parameter, as declared in a global <xsl:param>
element in the stylesheetvalue
- the value of the parameterSaxonApiUncheckedException
- if the value is lazily evaluated, and evaluation failspublic void clearParameters()
setParameter(QName, XdmValue)
.
This resets the parameters to their initial ("undeclared") statepublic javax.xml.transform.URIResolver getURIResolver()
public void setErrorListener(javax.xml.transform.ErrorListener listener)
listener
- The error listener to be used. This is notified of all errors detected during the
compilation.public javax.xml.transform.ErrorListener getErrorListener()
public void setSchemaAware(boolean schemaAware)
schemaAware
- If true, the stylesheet will be compiled with schema-awareness
enabled even if it contains no xsl:import-schema declarations. If false, the stylesheet
is treated as schema-aware only if it contains one or more xsl:import-schema declarations.public boolean isSchemaAware()
setSchemaAware(boolean)
public boolean isRelocatable()
public void setRelocatable(boolean relocatable)
relocatable
- if true then static-base-uri() represents the deployed location of the package,
rather than its compile time locationpublic void setTargetEdition(java.lang.String edition)
edition
- the Saxon edition for the run-time environment. One of "EE", "PE", "HE", "JS", or "JS2".public java.lang.String getTargetEdition()
public void declareDefaultCollation(java.lang.String uri)
uri
- the absolute URI of the default collation. Either this URI must have been bound to a collation
using the method Configuration.registerCollation(String, StringCollator)
, or it must be a
collation that is recognized implicitly, such as a UCA collationjava.lang.IllegalStateException
- if the collation URI is not a recognized collationpublic java.lang.String getDefaultCollation()
public void setXsltLanguageVersion(java.lang.String version)
version
- the language level to be supported. The value is ignored.java.lang.IllegalArgumentException
- if the value is not equal to 0.0, 2.0, or 3.0public java.lang.String getXsltLanguageVersion()
public boolean isAssertionsEnabled()
public void setAssertionsEnabled(boolean enabled)
enabled
- true if assertions are enabled at compile timepublic void setFastCompilation(boolean fast)
Fast compilation may result in static errors going unreported, especially if they occur in code that is never executed.
The current implementation is equivalent to switching off all optimizations other than just-in-time compilation of template rules. Setting this option, however, indicates an intent rather than a mechanism, and the implementation details may change in future to reflect the intent.
fast
- set to true to request fast compilation; set to false to revert to the optimization options
defined in the Configuration.public boolean isFastCompilation()
public void setCompileWithTracing(boolean option)
option
- true if trace code is to be compiled in, false otherwisepublic boolean isCompileWithTracing()
public void setGenerateByteCode(boolean option)
option
- true if bytecode is to be generated, false otherwisepublic boolean isGenerateByteCode()
public void importXQueryEnvironment(XQueryCompiler queryCompiler)
saxon:import-query
declaration.queryCompiler
- An XQueryCompiler that has been used to compile a library of XQuery functions
(by using one of the overloaded methods named compileLibrary
).public javax.xml.transform.Source getAssociatedStylesheet(javax.xml.transform.Source source, java.lang.String media, java.lang.String title, java.lang.String charset) throws SaxonApiException
The returned Source will have an absolute URI, created by resolving
any relative URI against the base URI of the supplied source document,
and redirected if necessary by using the URIResolver associated with this
XsltCompiler
.
source
- The XML source document. Note that if the source document
is available as an instance of XdmNode
, a corresponding Source
can be obtained using the method XdmNode.asSource()
.
If the source is a StreamSource or SAXSource, it will be read only as far as the
xml-stylesheet processing instruction (but the Source will be consumed and must not
be re-used).media
- The media attribute to be matched. May be null, in which
case the prefered templates will be used (i.e. alternate = no).
Note that Saxon does not implement the complex CSS3-based syntax for
media queries. By default, the media value is simply ignored. An algorithm for
comparing the requested media with the declared media can be defined using
the method Configuration.setMediaQueryEvaluator(Comparator)
.title
- The value of the title attribute to match. May be null.charset
- The value of the charset attribute to match. May be null.compile(javax.xml.transform.Source)
.SaxonApiException
- if any problems occur, including the case where no matching
xml-stylesheet processing instruction is found.public XsltPackage compilePackage(javax.xml.transform.Source source) throws SaxonApiException
The source argument identifies an XML file containing an <xsl:package> element. Any packages
on which this package depends must have been made available to the XsltCompiler
by importing them using importPackage(net.sf.saxon.s9api.XsltPackage)
.
source
- identifies an XML document holding the the XSLT package to be compiledXsltCompiler
; if the package is required
for use in subsequent compilations then it must be explicitly imported.SaxonApiException
- if the source cannot be read or if static errors are found during the
compilation. Any such errors will have been notified to the registered ErrorListener
if there is one, or reported on the System.err
output stream otherwise.- especially the notes regarding error handling and just-in-time compilation.
public java.lang.Iterable<XsltPackage> compilePackages(java.lang.Iterable<javax.xml.transform.Source> sources)
PackageLibrary
registered
with the underlying CompilerInfo
, or may be listed in the configuration file. Alternatively they
can be imported explicitly (taking care over the order of importing) using importPackage(XsltPackage)
.sources
- the collection of packages to be compiled, in the form of an Iterablejava.lang.UnsupportedOperationException
- - always. This method is no longer available
from Saxon 9.8public java.lang.Iterable<XsltPackage> addCompilePackages(java.lang.Iterable<javax.xml.transform.Source> sources, boolean link)
PackageLibrary
registered
with the underlying CompilerInfo
, or may be listed in the configuration file. Alternatively they
can be imported explicitly (taking care over the order of importing) using importPackage(XsltPackage)
.sources
- Sources for the packageslink
- Link each of the packages when loaded if truepublic XsltPackage loadLibraryPackage(java.net.URI location) throws SaxonApiException
The supplied URI represents the location of a resource which must have been originally
created using XsltPackage.save(java.io.File)
.
The result of loading the package is returned as an XsltPackage
object.
Note that this package is not automatically imported to this XsltCompiler
;
if the package is required for use in subsequent compilations then it must be explicitly
imported.
location
- the location from which the package is to be loaded, as a URISaxonApiException
- if no resource can be loaded from the supplied location or if the
resource that is loaded is not a compiled package, or if the compiled package is not
consistent with this XsltCompiler
(for example, if it was created using an
incompatible Saxon version).public XsltExecutable loadExecutablePackage(java.net.URI location) throws SaxonApiException
The supplied URI represents the location of a resource which must have been originally
created using XsltPackage.save(java.io.File)
or some equivalent.
The result of loading the package is returned as an XsltExecutable
object.
location
- the location from which the package is to be loaded, as a URISaxonApiException
- if no resource can be loaded from the supplied location or if the
resource that is loaded is not a compiled package, or if the compiled package is not
consistent with this XsltCompiler
(for example, if it was created using an
incompatible Saxon version).public void importPackage(XsltPackage thePackage) throws SaxonApiException
xsl:use-package
declarations of subsequent compilations performed using this
XsltCompiler
.thePackage
- the package to be importedSaxonApiException
- if the imported package was created under a different Processor
public void importPackage(XsltPackage thePackage, java.lang.String packageName, java.lang.String version) throws SaxonApiException
xsl:use-package
declaration of subsequent compilations performed using the XsltCompiler
. The
supplied package name and version are used in place of the name and version used in the XSLT
source code. This provides a level of indirection: for example the same source package can
be compiled twice, with different settings for the static parameter values, and the two
different compiled versions can then be selected from xsl:use-package declarations. distinguishing
them by the new package name and/or version.thePackage
- the package to be importedpackageName
- the new package name to be used. If null, the original package name is used
unchangedversion
- the new package version number to be used. If null, the original package version
number is used unchangedSaxonApiException
- if the imported package was created under a different Processor
,
or if the supplied version number is invalidpublic XsltPackage obtainPackage(java.lang.String packageName, java.lang.String versionRange) throws SaxonApiException
XsltCompiler
, which defaults
to the package library defined in the Configuration
, typically set up by loading a configuration
file.packageName
- the name of the required package. This is the name under which it is registered
in the package library, which is not necessarily the same as the name appearing
in the XSLT source code.versionRange
- the required version of the package, or range of versions, in the format
of the package-version attribute of xsl:use-package.SaxonApiException
public XsltPackage obtainPackageWithAlias(java.lang.String alias) throws SaxonApiException
alias
- the alias of the package/version in the configuration fileSaxonApiException
- the package does not exist, or if compiling the package failspublic XsltExecutable compile(javax.xml.transform.Source source) throws SaxonApiException
Note: the term "compile" here indicates that the stylesheet is converted into an executable form. There is no implication that this involves code generation.
The source argument identifies the XML document holding the principal stylesheet module. Other
modules will be located relative to this module by resolving relative URIs found in <xsl:include>
and <xsl:import>
declarations against the base URI that is defined
as the systemId
property of the supplied Source
.
The following kinds of Source
are recognized:
StreamSource
, allowing the stylesheet to be supplied as a
URI, as a File
, as an InputStream
, or as a Reader
SAXSource
, allowing the stylesheet to be supplied as a stream
of SAX events from a SAX2-compliant XML parser (or any other source of SAX events)DOMSource
, allowing the stylesheet to be supplied as a
DOM treeNodeInfo
, representing the root of a tree in any of the native tree formats supported
by SaxonThe compilation uses a snapshot of the properties of the XsltCompiler
at the
time this method is invoked. This is relevant when JIT compilation is enabled (which is the default
under Saxon-EE). Under JIT compilation, templates are compiled when first executed, which will typically be after
the compile()
method has returned. Subsequent changes to the properties of the XsltCompiler
,
for example, setting a new ErrorListener
, have no effect on the delayed compilation of
template rules at execution time.
If JIT compilation is enabled (this is the default for Saxon-EE), then static errors in template
rules might be detected not during execution of the compile()
method, but rather
when the relevant code is first executed. In this situation the compile()
method will
not throw an exception, but the errors will still (eventually) be notified to the ErrorListener
or ErrorList
associated with the compiler: more specifically, the ErrorListener
or ErrorList
that was associated with the XsltCompiler
at the time
compile()
was invoked.
source
- Source object representing the principal stylesheet module to be compiled.
Must not be null. If the Source
wraps a resource such as a Reader
or InputStream
then the resource will be consumed by the method.XsltExecutable
, which represents the compiled stylesheet. The XsltExecutable
is immutable and thread-safe; it may be used to run multiple transformations, in series or concurrently.SaxonApiException
- if the stylesheet contains static errors or if it cannot be read. Note that
the exception that is thrown will not contain details of the actual errors found in the stylesheet. These
will instead be notified to the registered ErrorListener
or ErrorList
.
The default ErrorListener
displays error messages on the standard error output.public CompilerInfo getUnderlyingCompilerInfo()
CompilerInfo
object, which provides more detailed (but less stable) control
over some compilation optionsCompilerInfo
object, which holds compilation-time options. The methods on
the CompilerInfo
object are not guaranteed stable from release to release.public void setErrorList(java.util.List<StaticError> errorList)
List
which will be populated with information about any static errors
encountered during the transformation.
Calling this method overwrites the effect of any previous call on setErrorListener(ErrorListener)
as well as previous calls on setErrorList
.
errorList
- a List (typically empty) to which information will be appended about
static errors found during the compilation. Each such error is represented by a
StaticError
object.public void setJustInTimeCompilation(boolean jit)
jit
- true if just-in-time compilation is to be enabled. With this option enabled,
static analysis of a template rule is deferred until the first time that the
template is matched. This can improve performance when many template
rules are rarely used during the course of a particular transformation; however,
it means that static errors in the stylesheet will not necessarily cause the
compile(Source)
method to throw an exception (errors in code that is
actually executed will still be notified to the registered ErrorListener
or ErrorList
, but this may happen after the compile(Source)
method returns). This option is enabled by default in Saxon-EE, and is not available
in Saxon-HE or Saxon-PE.
Recommendation: disable this option unless you are confident that the stylesheet you are compiling is error-free.
java.lang.UnsupportedOperationException
- if the argument is set to true
and the
configuration is not a licensed Saxon-EE configuration.public boolean isJustInTimeCompilation()
Copyright (c) 2004-2020 Saxonica Limited. All rights reserved.