This [[Module Library|XQuery Module]] contains functions and variables to perform XSLT XSL transformations. By default, this module uses Java’s XSLT 1.0 Xalan implementation to transform documents. XSLT 23.0 is used instead if Version 9.x of the [httphttps://www.saxonica.com/ Saxon XSLT Processor] is found in the class path ({{Code|saxon9hee.g.jar}}, {{Codeby placing the library files in the [[Startup#Full Distributions|saxon9pe.jar}}, {{Code|saxon9ee.jarlib/custom}}directory]]) is found in the classpath. A custom specific transformer can be specified by overwriting assigning a classpath to the system property {{Code|javax.xml.transform.TransformerFactory}}with the [https://docs.oracle.com/en/java/javase/11/tools/java.html -D flag] on the command line, as shown or directly in the following Java example: <pre lang="java">System.setProperty( "javax.xml.transform.TransformerFactory", "org.custom.xslt.TransformerFactoryImpl");
<pre class="brush:java">
System.setProperty("javax.xml.transform.TransformerFactory", "org.custom.xslt.TransformerFactoryImpl");
Context ctx = new Context();
String result = new XQuery("xslt:transform('...', '...')").execute(ctx);
=Conventions=
{{Mark|Updated with Version 9.0:}}
All functions and errors in this module are assigned to the <code><nowiki>http://basex.org/modules/xslt</nowiki></code> namespace, which is statically bound to the {{Code|xslt}} prefix.<br/>
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Code|'''xslt:processor'''() as xs:string}}<br />|-valign="top"
| '''Summary'''
|Returns the name of the applied XSLT processor, or the path to a custom implementation (currently: "Java", "Saxon EE", "Saxon PE", or "Saxon HE"). If a system property was assigned that points to an existing implementation other than Saxon, the classpath is returned instead.<br />
|}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Code|'''xslt:version'''() as xs:string}}<br />|-valign="top"
| '''Summary'''
|Returns the supported XSLT version (currently: "1.0" or , "23.0"). "Unknown" An empty string is returned if a custom classpath in the system property points to an existing implementation was chosenother than Saxon.<br />
|}
==xslt:transform==
{{Mark|Updated with Version 9.0:}} {{Code|$options}} argument added.
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|xslt:transform|$input as item(), $stylesheet as item()|node()}}<br /pre>{{Func|xslt:transform|( $input as item(), $stylesheet as item(), $params arguments as map(*)?|node()} := map { }<br />{{Func|xslt:transform|$input as item(), $stylesheet as item(), $params options as map(*)?, $options as := map(*{ })?|as node()}}</pre>|-valign="top"
| '''Summary'''
|Transforms the document specified by {{Code|$input}}, using the XSLT template specified by {{Code|$stylesheet}}, and returns the result as node. {{Code|$input}} and {{Code|$stylesheet}} can be specified as<br />
* {{Code|xs:string}}, containing the stylesheet URI,
* {{Code|xs:string}}, containing the document in its string representation, or
* {{Code|node()}}, containing the document itself.
The [[Catalog Resolver|XML Catalog files]] will be considered when resolving URIs. Variables can be bound to a stylesheet via {{Code|$paramsarguments}} argument can be used to bind variables to a stylesheet. Only (only strings are supported when using Saxon (XSLT 23.0and Saxon). The following {{Code|$options}} are available:
* {{Code|cache}}: cache XSLT transformer (speeds up repeated transformations, but increases memory consumption)
|-valign="top"
| '''Error'''
|{{Error|error|#Errors}} an error occurred during the transformation process.
==xslt:transform-text==
{{Mark|Updated with Version 9.0:}} {{Code|$options}} argument added.
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|xslt:transform-text|$input as item(), $stylesheet as item()|xs:string}}<br /pre>{{Func|xslt:transform-text|( $input as item(), $stylesheet as item(), $params arguments as map(*)?|xs :string= map { }}<br />{{Func|xslt:transform-text|$input as item(), $stylesheet as item(), $params options as map(*)?, $options as := map(*{ })?|as xs:string}}</pre>|-valign="top"
| '''Summary'''
|Transforms the document specified by {{Code|$input}}, using the XSLT template specified by {{Code|$stylesheet}}, and returns the result as string. The semantics of {{Code|$params}} and {{Code|$options}} is the same as for [[#xslt:transform{{Function||xslt:transform]]}}.<br />|-valign="top"
| '''Error'''
|{{Error|error|#Errors}} an error occurred during the transformation process.
|}
==Examplesxslt:transform-report==
{| width='100%'|- valign="top"| width='Example 1120' | '''Signature'''|<pre>xslt:transform-report( $input as item(), $stylesheet as item(), $arguments as map(*)? := map { }, $options as map(*)? := map { }) as xs:string</pre>|- valign="top"| '''Summary'''|Transforms the document specified by {{Code|$input}}, using the XSLT template specified by {{Code|$stylesheet}}, and returns a map with the following keys: Basic XSL * {{Code|result}}: The transformation with dummy result: One or more document nodes, or (if the result cannot be converted to XML) an item of type {{Code|xs:untypedAtomic}}.* {{Code|messages}}: Informational output generated by {{Code|xsl:message}} elements: A sequence of arrays. The arrays consist of XML elements, or (for those messages that cannot be converted to XML) items of type {{Code|xs:untypedAtomic}}.The semantics of {{Code|$params}} and without parameters'''{{Code|$options}} is the same as for {{Function||xslt:transform}}.<br/>For the moment, messages can only be returned with recent versions of Saxon.* {{Code|error}} (optional): An error string, which would be raised as an error by the other functions of this module.|}
'''Query:'''<pre class="brush:xquery">xslt:transform-text(<dummy/>, 'basic.xslt')</pre> '''basic.xslt'''<pre class="brush:xml"><xsl:stylesheet versionExamples='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/">123</xsl:template></xsl:stylesheet></pre> '''Result:'''<pre class="brush:xml">123</pre>
'''Example 21: XSLT XSL transformation of an input document, with XML and XSL supplied as nodes'''
'''Query:'''
<pre classlang="brush:'xquery"'>
(: Outputs the result as html. :)
declare option output:method 'html';
(: Turn whitespace chopping off. :)
declare option db:chop 'no';
let $in :=
</books>
let $style :=
<xsl:stylesheet version='23.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml'/>
<xsl:template match="/">
return xslt:transform($in, $style)</pre>
'''Result:'''
<pre classlang="brush:xml">
<html>
<body>
</pre>
'''Example 32: Assigning a variable to an XSLT stylesheetTextual XSL transformation'''
'''Query:'''
<pre classlang='xquery'>xslt:transform-text(<dummy/>, 'basic.xslt')</pre> '''basic.xslt'''<pre lang="xml"><xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="brush/">123</xsl:template></xsl:stylesheet></pre> '''Result:'''<pre lang="xml">123</pre> '''Example 3: XSL transformation with variable assignment''' '''Query:'''<pre lang='xquery"'>
let $in := <dummy/>
let $style := doc('variable.xsl')
'''variable.xsl'''
<pre classlang="brush:xslt">
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
'''Result:'''
<pre classlang="brush:xml">
<v>1</v>
<v>1</v>
</pre>
'''Example 4: XSL transformation, yielding a result and info messages'''
'''Query:'''
<pre lang='xquery'>
xslt:transform-report(
<_/>,
<xsl:transform version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<xsl:message><msg>START...</msg></xsl:message>
<xml>123</xml>
<xsl:message select='4, 5, "...END"'/>
</xsl:template>
</xsl:transform>
)
</pre>
'''Result:'''
<pre lang='xquery'>
map {
"messages": ([<msg>START...</msg>], ["4 5 ...END"]),
"result": <xml>123</xml>
}
</pre>
=Errors=
{{Mark|Updated with Version 9.0:}}
{| class="wikitable" width="100%"
! width="110"|Code
|Description
|-valign="top"
|{{Code|error}}
| An error occurred during the transformation process.
=Changelog=
;Version 9.7
* Added: {{Function||xslt:transform-report}}
;Version 9.2
* Updated: Support for XML Catalog files added.
;Version 9.0
* Updated: [[#xslt:transform{{Function||xslt:transform]]}}, [[#xslt:transform-text{{Function||xslt:transform-text]]}}: {{Code|$options}} argument added.
* Updated: error codes updated; errors now use the module namespace
;Version 7.6
* Added: [[#xslt:transform-text{{Function||xslt:transform-text]]}}* Updated: [[#xslt:transform{{Function||xslt:transform]] }} returned error code
;Version 7.3
* Updated: $xslt:processor → [[#xslt:processor{{Function||xslt:processor]]}}, $xslt:version → [[#xslt:version{{Function||xslt:version]]}}