Class Xslt30Transformer
- java.lang.Object
-
- net.sf.saxon.s9api.AbstractXsltTransformer
-
- net.sf.saxon.s9api.Xslt30Transformer
-
public class Xslt30Transformer extends AbstractXsltTransformer
AnXslt30Transformer
represents a compiled and loaded stylesheet ready for execution. TheXslt30Transformer
holds details of the dynamic evaluation context for the stylesheet.The
Xslt30Transformer
differs fromXsltTransformer
is supporting new options for invoking a stylesheet, corresponding to facilities defined in the XSLT 3.0 specification. However, it is not confined to use with XSLT 3.0, and most of the new invocation facilities (for example, calling a stylesheet-defined function directly) work equally well with XSLT 2.0 and in some cases XSLT 1.0 stylesheets.An
Xslt30Transformer
must not be used concurrently in multiple threads. It is safe to reuse the object within a single thread to run several transformations using the same stylesheet, but the values of the global context item and of stylesheet parameters must be initialized before any transformations are run, and must remain unchanged thereafter. The date/time value returned byfn:current-dateTime()
also remains constant for the duration of anXslt30Transformer.
Some of the entry point methods are synchronized. This is not because multi-threaded execution is permitted; rather it is to reduce the damage if it is attempted.
An
Xslt30Transformer
is always constructed by running the methodXsltExecutable.load30()
.Unlike
XsltTransformer
, anXslt30Transformer
is not aDestination
. To pipe the results of one transformation into another, the target should be anXsltTransfomer
rather than anXslt30Transformer
.Evaluation of an Xslt30Transformer proceeds in a number of phases:
- First, values may be supplied for stylesheet parameters and for the global context item. The global context item is used when initializing global variables. Unlike earlier transformation APIs, the global context item is quite independent of the "principal Source document".
- The stylesheet may now be repeatedly invoked. Each invocation takes one of three forms:
- Invocation by applying templates. In this case, the information required is (i) an initial
mode (which defaults to the unnamed mode), (ii) an initial match sequence, which is any
XDM value, which is used as the effective "select" expression of the implicit apply-templates
call, and (iii) optionally, values for the tunnel and non-tunnel parameters defined on the
templates that get invoked (equivalent to using
xsl:with-param
on the implicitapply-templates
call). - Invocation by calling a named template. In this case, the information required is
(i) the name of the initial template (which defaults to "xsl:initial-template"), and
(ii) optionally, values for the tunnel and non-tunnel parameters defined on the
templates that get invoked (equivalent to using
xsl:with-param
on the implicitcall-template
instruction). - Invocation by calling a named function. In this case, the information required is the sequence of arguments to the function call.
- Invocation by applying templates. In this case, the information required is (i) an initial
mode (which defaults to the unnamed mode), (ii) an initial match sequence, which is any
XDM value, which is used as the effective "select" expression of the implicit apply-templates
call, and (iii) optionally, values for the tunnel and non-tunnel parameters defined on the
templates that get invoked (equivalent to using
- Whichever invocation method is chosen, the result may either be returned directly, as an arbitrary XDM value, or it may effectively be wrapped in an XML document. If it is wrapped in an XML document, that document can be processed in a number of ways, for example it can be materialized as a tree in memory, it can be serialized as XML or HTML, or it can be subjected to further transformation.
Once the stylesheet has been invoked (using any of these methods), the values of the global context item and stylesheet parameters cannot be changed. If it is necessary to run another transformation with a different context item or different stylesheet parameters, a new
Xslt30Transformer
should be created from the originalXsltExecutable
.- Since:
- 9.6
-
-
Field Summary
-
Fields inherited from class net.sf.saxon.s9api.AbstractXsltTransformer
baseOutputUriWasSet, controller, processor
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
Xslt30Transformer(Processor processor, XsltController controller, GlobalParameterSet staticParameters)
Protected constructor
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description XdmValue
applyTemplates(javax.xml.transform.Source source)
Invoke the stylesheet by applying templates to a supplied Source document, returning the raw results as anXdmValue
.void
applyTemplates(javax.xml.transform.Source source, Destination destination)
Invoke the stylesheet by applying templates to a supplied Source document, sending the results (wrapped in a document node) to a given Destination.XdmValue
applyTemplates(XdmValue selection)
Invoke the stylesheet by applying templates to a supplied input sequence, returning the raw results.void
applyTemplates(XdmValue selection, Destination destination)
Invoke the stylesheet by applying templates to a supplied input sequence, sending the results (wrapped in a document node) to a given Destination.Destination
asDocumentDestination(Destination finalDestination)
Construct aDestination
object whose effect is to perform this transformation on any input that is sent to thatDestination
: for example, it allows this transformation to post-process the results of another transformation.XdmValue
callFunction(QName function, XdmValue[] arguments)
Call a public user-defined function in the stylesheet.void
callFunction(QName function, XdmValue[] arguments, Destination destination)
Call a public user-defined function in the stylesheet, wrapping the result in an XML document, and sending this document to a specified destinationXdmValue
callTemplate(QName templateName)
Invoke a transformation by calling a named template.void
callTemplate(QName templateName, Destination destination)
Invoke a transformation by calling a named template.XdmItem
getGlobalContextItem()
Get the global context itemSerializer
newSerializer()
Create a serializer initialised to use the default output parameters defined in the stylesheet.Serializer
newSerializer(java.io.File file)
Create a serializer initialised to use the default output parameters defined in the stylesheet.Serializer
newSerializer(java.io.OutputStream stream)
Create a serializer initialised to use the default output parameters defined in the stylesheet.Serializer
newSerializer(java.io.Writer writer)
Create a serializer initialised to use the default output parameters defined in the stylesheet.void
setGlobalContextItem(XdmItem globalContextItem)
Supply the context item to be used when evaluating global variables and parameters.void
setGlobalContextItem(XdmItem globalContextItem, boolean alreadyStripped)
Supply the context item to be used when evaluating global variables and parameters.<T extends XdmValue>
voidsetInitialTemplateParameters(java.util.Map<QName,T> parameters, boolean tunnel)
Set parameters to be passed to the initial template.<T extends XdmValue>
voidsetStylesheetParameters(java.util.Map<QName,T> parameters)
Supply the values of global stylesheet parameters.void
transform(javax.xml.transform.Source source, Destination destination)
Invoke the stylesheet by applying templates to a supplied Source document, sending the results to a given Destination.-
Methods inherited from class net.sf.saxon.s9api.AbstractXsltTransformer
applyTemplatesToSource, getBaseOutputURI, getDestinationReceiver, getErrorListener, getErrorReporter, getInitialMode, getMessageListener2, getReceivingTransformer, getResourceResolver, getSchemaValidationMode, getTraceFunctionDestination, getTraceListener, getUnderlyingController, getUnparsedTextURIResolver, getURIResolver, isAssertionsEnabled, isStreamableSource, setAssertionsEnabled, setBaseOutputURI, setErrorListener, setErrorReporter, setInitialMode, setMessageHandler, setMessageListener, setResourceResolver, setResultDocumentHandler, setSchemaValidationMode, setTraceFunctionDestination, setTraceListener, setUnparsedTextResolver, setURIResolver
-
-
-
-
Constructor Detail
-
Xslt30Transformer
protected Xslt30Transformer(Processor processor, XsltController controller, GlobalParameterSet staticParameters)
Protected constructor- Parameters:
processor
- the S9API processorcontroller
- the Saxon controller objectstaticParameters
- the static parameters supplied at stylesheet compile time
-
-
Method Detail
-
setGlobalContextItem
public void setGlobalContextItem(XdmItem globalContextItem) throws SaxonApiException
Supply the context item to be used when evaluating global variables and parameters. A call onsetGlobalContextItem(node)
is equivalent to a call onsetGlobalContextItem(node, false)
: that is, it is assumed that stripping of type annotations and whitespace text nodes has not yet been performed.Note: It is more efficient to do whitespace stripping while constructing the source tree. This can be achieved by building the source tree using a
DocumentBuilder
initialized usingDocumentBuilder.setWhitespaceStrippingPolicy(WhitespaceStrippingPolicy)
, supplying aWhitespaceStrippingPolicy
obtained by callingXsltExecutable.getWhitespaceStrippingPolicy()
.- Parameters:
globalContextItem
- the item to be used as the context item within the initializers of global variables and parameters. This argument can be null if no context item is to be supplied.- Throws:
java.lang.IllegalStateException
- if the transformation has already been evaluated by calling one of the methodsapplyTemplates
,callTemplate
, orcallFunction
SaxonApiException
- Not thrown, but retained in the method signature for compatibility reasons. Note that no error is thrown at this stage if the context item is of the wrong type.
-
setGlobalContextItem
public void setGlobalContextItem(XdmItem globalContextItem, boolean alreadyStripped) throws SaxonApiException
Supply the context item to be used when evaluating global variables and parameters.- Parameters:
globalContextItem
- the item to be used as the context item within the initializers of global variables and parameters. This argument can be null if no context item is to be supplied.alreadyStripped
- true if any stripping of type annotations or whitespace text nodes specified by the stylesheet has already taken place- Throws:
java.lang.IllegalStateException
- if the transformation has already been evaluated by calling one of the methodsapplyTemplates
,callTemplate
, orcallFunction
SaxonApiException
- Not thrown, but retained in the method signature for compatibility reasons. Note that no error is thrown at this stage if the context item is of the wrong type.
-
getGlobalContextItem
public XdmItem getGlobalContextItem()
Get the global context item- Returns:
- the global context item if it has been set, or null otherwise
-
setStylesheetParameters
public <T extends XdmValue> void setStylesheetParameters(java.util.Map<QName,T> parameters) throws SaxonApiException
Supply the values of global stylesheet parameters.If a value is supplied for a parameter with a particular name, and the stylesheet does not declare a parameter with that name, then the value is simply ignored.
If a value is supplied for a parameter with a particular name, and the stylesheet declaration of that parameter declares a required type, then the supplied value will be checked against that type when the value of the parameter is first used (and any error will be reported only then). Parameter values are converted to the required type using the function conversion rules.
If a value is supplied for a parameter with a particular name, and the stylesheet declaration of that parameter declares it with the attribute
static="yes"
, then an error will be reported when the transformation is initiated.If a value is supplied for a parameter with a particular name, and a parameter with the same name was supplied at compile time using
XsltCompiler.setParameter(QName, XdmValue)
, then an error will be reported with the transformation is initiated.- Type Parameters:
T
- the type of values for the parameters- Parameters:
parameters
- a map whose keys are QNames identifying global stylesheet parameters, and whose corresponding values are the values to be assigned to those parameters. The contents of the supplied map are copied by this method, so subsequent changes to the map have no effect.- Throws:
java.lang.IllegalStateException
- if the transformation has already been evaluated by calling one of the methodsapplyTemplates
,callTemplate
, orcallFunction
SaxonApiException
- currently occurs only if the supplied value of a parameter cannot be evaluated
-
setInitialTemplateParameters
public <T extends XdmValue> void setInitialTemplateParameters(java.util.Map<QName,T> parameters, boolean tunnel) throws SaxonApiException
Set parameters to be passed to the initial template. These are used whether the transformation is invoked by applying templates to an initial source item, or by invoking a named template. The parameters in question are the xsl:param elements appearing as children of the xsl:template element.The parameters are supplied in the form of a map; the key is a QName which must match the name of the parameter; the associated value is an XdmValue containing the value to be used for the parameter. If the initial template defines any required parameters, the map must include a corresponding value. If the initial template defines any parameters that are not present in the map, the default value is used. If the map contains any parameters that are not defined in the initial template, these values are silently ignored.
The supplied values are converted to the required type using the function conversion rules. If conversion is not possible, a run-time error occurs (not now, but later, when the transformation is actually run).
The
XsltTransformer
retains a reference to the supplied map, so parameters can be added or changed until the point where the transformation is run.The XSLT 3.0 specification makes provision for supplying parameters to the initial template, as well as global stylesheet parameters. Although there is no similar provision in the XSLT 1.0 or 2.0 specifications, this method works for all stylesheets, regardless whether XSLT 3.0 is enabled or not.
- Type Parameters:
T
- the type of values for the parameters- Parameters:
parameters
- the parameters to be used for the initial templatetunnel
- true if these values are to be used for setting tunnel parameters; false if they are to be used for non-tunnel parameters- Throws:
SaxonApiException
- not currently used, but retained in the method signature for compatibility reasons
-
applyTemplates
public void applyTemplates(javax.xml.transform.Source source, Destination destination) throws SaxonApiException
Invoke the stylesheet by applying templates to a supplied Source document, sending the results (wrapped in a document node) to a given Destination. The invocation uses any initial mode set usingAbstractXsltTransformer.setInitialMode(QName)
, and any template parameters set usingsetInitialTemplateParameters(java.util.Map, boolean)
.Note that this method does not cause the supplied Source document to become the global context item (that is, to be available as the value of "." when evaluating global variables. If a global context item is required, this must be set separately using
setGlobalContextItem(XdmItem)
. Alternatively, use thetransform(Source, Destination)
method.- Parameters:
source
- the source document. For streamed processing, this must be a SAXSource or StreamSource.Note: supplying a
DOMSource
is allowed, but is much less efficient than using aStreamSource
orSAXSource
and leaving Saxon to build the tree in its own internal format. To apply more than one transformation to the same source document, the source document tree can be pre-built using aDocumentBuilder
.destination
- the destination of the principal result of the transformation. If the destination is aSerializer
, then the serialization parameters set in the serializer are combined with those defined in the stylesheet (the parameters set in the serializer take precedence).- Throws:
SaxonApiException
- if the transformation fails
-
applyTemplates
public XdmValue applyTemplates(javax.xml.transform.Source source) throws SaxonApiException
Invoke the stylesheet by applying templates to a supplied Source document, returning the raw results as anXdmValue
. The invocation uses any initial mode set usingAbstractXsltTransformer.setInitialMode(QName)
, and any template parameters set usingsetInitialTemplateParameters(java.util.Map, boolean)
.Note that this method does not cause the supplied Source document to become the global context item (that is, to be available as the value of "." when evaluating global variables. If a global context item is required, this must be set separately using
setGlobalContextItem(XdmItem)
. Alternatively, use thetransform(Source, Destination)
method.- Parameters:
source
- the source document. For streamed processing, this must be a SAXSource or StreamSource.Note: supplying a
DOMSource
is allowed, but is much less efficient than using aStreamSource
orSAXSource
and leaving Saxon to build the tree in its own internal format. To apply more than one transformation to the same source document, the source document tree can be pre-built using aDocumentBuilder
.- Returns:
- the raw result of processing the supplied Source using the selected template rule, without wrapping the returned sequence in a document node
- Throws:
SaxonApiException
- if the transformation fails
-
transform
public void transform(javax.xml.transform.Source source, Destination destination) throws SaxonApiException
Invoke the stylesheet by applying templates to a supplied Source document, sending the results to a given Destination. The invocation uses the initial mode set usingAbstractXsltTransformer.setInitialMode(QName)
(defaulting to the default mode defined in the stylesheet itself, which by default is the unnamed mode). It also uses any template parameters set usingsetInitialTemplateParameters(java.util.Map, boolean)
.The document supplied in the
source
argument also acts as the global context item for the transformation. Any item previously supplied usingsetGlobalContextItem(XdmItem)
is ignored.Because this method sets the global context item to the root node of the supplied
source
, it cannot be used when the stylesheet is designed to process streamed input. For streamed processing, useapplyTemplates(Source, Destination)
instead.- Parameters:
source
- the source document.Note: supplying a
DOMSource
is allowed, but is much less efficient than using aStreamSource
orSAXSource
and leaving Saxon to build the tree in its own internal format. To apply more than one transformation to the same source document, the source document tree can be pre-built using aDocumentBuilder
.destination
- the destination of the principal result of the transformation. If the destination is aSerializer
, then the serialization parameters set in the serializer are combined with those defined in the stylesheet (the parameters set in the serializer take precedence).- Throws:
SaxonApiException
- if the transformation fails, or if the initial mode in the stylesheet is declared to be streamable.- Since:
- 9.9.1.1
-
applyTemplates
public void applyTemplates(XdmValue selection, Destination destination) throws SaxonApiException
Invoke the stylesheet by applying templates to a supplied input sequence, sending the results (wrapped in a document node) to a given Destination. The invocation uses any initial mode set usingAbstractXsltTransformer.setInitialMode(QName)
, and any template parameters set usingsetInitialTemplateParameters(java.util.Map, boolean)
.Note that this method does not cause the supplied Source document to become the global context item (that is, to be available as the value of "." when evaluating global variables. If a global context item is required, this must be set separately using
setGlobalContextItem(XdmItem)
. Alternatively, use thetransform(Source, Destination)
method.- Parameters:
selection
- the initial value to which templates are to be applied (equivalent to theselect
attribute ofxsl:apply-templates
)destination
- the destination for the result document. In most cases this causes the raw result of the transformation to be wrapped in a document node. However, if the destination is a Serializer and the output method is "json" or "adaptive", then no wrapping takes place.- Throws:
SaxonApiException
- if the transformation fails- Since:
- 9.6. Changed in 9.7.0.1 so that if a Serializer is supplied as the Destination, it will not
be modified by this method to set output properties from the stylesheet; instead, the Serializer
should be initialized by calling the
newSerializer
method on thisXslt30Transformer
-
applyTemplates
public XdmValue applyTemplates(XdmValue selection) throws SaxonApiException
Invoke the stylesheet by applying templates to a supplied input sequence, returning the raw results. as anXdmValue
. The invocation uses any initial mode set usingAbstractXsltTransformer.setInitialMode(QName)
, and any template parameters set usingsetInitialTemplateParameters(java.util.Map, boolean)
.Note that this method does not cause the supplied selection to become the global context item (that is, to be available as the value of "." when evaluating global variables. If a global context item is required, this must be set separately using
setGlobalContextItem(XdmItem)
. Alternatively, use thetransform(Source, Destination)
method.- Parameters:
selection
- the initial value to which templates are to be applied (equivalent to theselect
attribute ofxsl:apply-templates
)- Returns:
- the raw result of applying templates to the supplied selection value, without wrapping in a document node or serializing the result. If there is more that one item in the selection, the result is the concatenation of the results of applying templates to each item in turn.
- Throws:
SaxonApiException
- if the transformation fails
-
callTemplate
public void callTemplate(QName templateName, Destination destination) throws SaxonApiException
Invoke a transformation by calling a named template. The results of calling the template are wrapped in a document node, which is then sent to the specified destination. IfsetInitialTemplateParameters(java.util.Map, boolean)
has been called, then the parameters supplied are made available to the called template (no error occurs if parameters are supplied that are not used).- Parameters:
templateName
- the name of the initial template. This must match the name of a public named template in the stylesheet. If the value is null, the QNamexsl:initial-template
is used.destination
- the destination for the result document.- Throws:
SaxonApiException
- if there is no named template with this name, or if any dynamic error occurs during the transformation- Since:
- 9.6. Changed in 9.7.0.1 so that if a Serializer is supplied as the Destination, it will not
be modified by this method to set output properties from the stylesheet; instead, the Serializer
should be initialized by calling the
newSerializer
method on thisXslt30Transformer
-
callTemplate
public XdmValue callTemplate(QName templateName) throws SaxonApiException
Invoke a transformation by calling a named template. The results of calling the template are returned as a raw value, without wrapping in a document node or serializing.- Parameters:
templateName
- the name of the initial template. This must match the name of a public named template in the stylesheet. If the value is null, the QNamexsl:initial-template
is used.- Returns:
- the raw results of the called template, without wrapping in a document node or serialization.
- Throws:
SaxonApiException
- if there is no named template with this name, or if any dynamic error occurs during the transformation
-
callFunction
public XdmValue callFunction(QName function, XdmValue[] arguments) throws SaxonApiException
Call a public user-defined function in the stylesheet.- Parameters:
function
- The name of the function to be calledarguments
- The values of the arguments to be supplied to the function. These will be converted if necessary to the type as defined in the function signature, using the function conversion rules.- Returns:
- the result of calling the function. This is the raw result, without wrapping in a document node and without serialization.
- Throws:
SaxonApiException
- if no function has been defined with the given name and arity; or if any of the arguments does not match its required type according to the function signature; or if a dynamic error occurs in evaluating the function.
-
callFunction
public void callFunction(QName function, XdmValue[] arguments, Destination destination) throws SaxonApiException
Call a public user-defined function in the stylesheet, wrapping the result in an XML document, and sending this document to a specified destination- Parameters:
function
- The name of the function to be calledarguments
- The values of the arguments to be supplied to the function. These will be converted if necessary to the type as defined in the function signature, using the function conversion rules.destination
- the destination of the result document produced by wrapping the result of the apply-templates call in a document node.- Throws:
SaxonApiException
- in the event of a dynamic error- Since:
- 9.6. Changed in 9.7.0.1 so that if a Serializer is supplied as the Destination, it will not
be modified by this method to set output properties from the stylesheet; instead, the Serializer
should be initialized by calling the
newSerializer
method on thisXslt30Transformer
-
asDocumentDestination
public Destination asDocumentDestination(Destination finalDestination)
Construct aDestination
object whose effect is to perform this transformation on any input that is sent to thatDestination
: for example, it allows this transformation to post-process the results of another transformation.This method allows a pipeline of transformations to be created in which one transformation is used as the destination of another. The transformations may use streaming, in which case intermediate results will not be materialized in memory. If a transformation does not use streaming, then its input will first be assembled in memory as a node tree.
The
Destination
returned by this method performs sequence normalization as defined in the serialization specification: that is, the raw result of the transformation sent to this destination is wrapped into a document node. Any item-separator present in any serialization parameters is ignored (adjacent atomic values are separated by whitespace). This makes the method unsuitable for passing intermediate results other than XML document nodes.- Parameters:
finalDestination
- the destination for the principal result of this transformation- Returns:
- a
Destination
which accepts an XML document (typically as a stream of events) and which transforms this supplied XML document (possibly using streaming) as defined by the stylesheet from which which thisXslt30Transformer
was generated, sending the principal result of the transformation to the suppliedfinalDestination
. The transformation is performed as if by theapplyTemplates(Source, Destination)
method: that is, by applying templates to the root node of the supplied XML document. - Since:
- 9.9
-
newSerializer
public Serializer newSerializer()
Create a serializer initialised to use the default output parameters defined in the stylesheet. These serialization parameters can be overridden by use ofSerializer.setOutputProperty(Serializer.Property, String)
.- Returns:
- the new serializer
- Since:
- 9.7.0.1
-
newSerializer
public Serializer newSerializer(java.io.File file)
Create a serializer initialised to use the default output parameters defined in the stylesheet. These serialization parameters can be overridden by use ofSerializer.setOutputProperty(Serializer.Property, String)
.- Parameters:
file
- the output file to which the serializer will write its output. As well as initializing the serializer to write to this output file, this method sets the base output URI of this Xslt30Transformer to be the URI of this file.- Returns:
- the new serializer
- Since:
- 9.7.0.1
-
newSerializer
public Serializer newSerializer(java.io.Writer writer)
Create a serializer initialised to use the default output parameters defined in the stylesheet. These serialization parameters can be overridden by use ofSerializer.setOutputProperty(Serializer.Property, String)
.- Parameters:
writer
- the Writer to which the serializer will write- Returns:
- the new serializer
- Since:
- 9.7.0.1
-
newSerializer
public Serializer newSerializer(java.io.OutputStream stream)
Create a serializer initialised to use the default output parameters defined in the stylesheet. These serialization parameters can be overridden by use ofSerializer.setOutputProperty(Serializer.Property, String)
.- Parameters:
stream
- the output stream to which the serializer will write- Returns:
- the new serializer
- Since:
- 9.7.0.1
-
-