Difference between revisions of "XSLT Module"

From BaseX Documentation
Jump to navigation Jump to search
Line 77: Line 77:
 
==xslt:transform-report==
 
==xslt:transform-report==
  
{{Mark|Introduced with Version 10.0:}}
+
{{Mark|Introduced with Version 9.7:}}
  
 
{| width='100%'
 
{| width='100%'
Line 224: Line 224:
 
=Changelog=
 
=Changelog=
  
;Version 10.0
+
;Version 9.7
 
* Added: [[#xslt:transform-report|xslt:transform-report]]
 
* Added: [[#xslt:transform-report|xslt:transform-report]]
  

Revision as of 12:27, 23 March 2022

This XQuery Module contains functions and variables to perform XSL transformations.

By default, this module uses Java’s XSLT 1.0 Xalan implementation to transform documents. XSLT 3.0 will be enabled if Version 9 or 10 of the Saxon XSLT Processor is found in the class path (see Distributions for more details). A custom transformer can be specified by assigning a class to the system property javax.xml.transform.TransformerFactory, e.g. directly in Java:

<syntaxhighlight lang="java"> System.setProperty(

 "javax.xml.transform.TransformerFactory",
 "org.custom.xslt.TransformerFactoryImpl");

Context ctx = new Context(); String result = new XQuery("xslt:transform('...', '...')").execute(ctx); ... ctx.close(); </syntaxhighlight>

Conventions

All functions and errors in this module are assigned to the http://basex.org/modules/xslt namespace, which is statically bound to the xslt prefix.

Functions

xslt:processor

Signatures xslt:processor() as xs:string
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").

xslt:version

Signatures xslt:version() as xs:string
Summary Returns the supported XSLT version (currently: "1.0" or "3.0"). "Unknown" is returned if a custom implementation was chosen.

xslt:transform

Signatures xslt:transform($input as item(), $stylesheet as item()) as node()
xslt:transform($input as item(), $stylesheet as item(), $params as map(*)?) as node()
xslt:transform($input as item(), $stylesheet as item(), $args as map(*)?, $options as map(*)?) as node()
Summary Transforms the document specified by $input, using the XSLT template specified by $stylesheet, and returns the result as node. $input and $stylesheet can be specified as
  • xs:string, containing the stylesheet URI,
  • xs:string, containing the document in its string representation, or
  • node(), containing the document itself.

XML Catalog files will be considered when resolving URIs. Variables can be bound to a stylesheet via $args (only strings are supported when using XSLT 3.0 and Saxon). The following $options are available:

  • cache: cache XSLT transformer (speeds up repeated transformations, but increases memory consumption)
Error error: an error occurred during the transformation process.

xslt:transform-text

Signatures xslt:transform-text($input as item(), $stylesheet as item()) as xs:string
xslt:transform-text($input as item(), $stylesheet as item(), $params as map(*)?) as xs:string
xslt:transform-text($input as item(), $stylesheet as item(), $params as map(*)?, $options as map(*)?) as xs:string
Summary Transforms the document specified by $input, using the XSLT template specified by $stylesheet, and returns the result as string. The semantics of $params and $options is the same as for xslt:transform.
Error error: an error occurred during the transformation process.

xslt:transform-report

Template:Mark

Signatures xslt:transform-report($input as item(), $stylesheet as item()) as xs:string
xslt:transform-report($input as item(), $stylesheet as item(), $params as map(*)?) as xs:string
xslt:transform-report($input as item(), $stylesheet as item(), $params as map(*)?, $options as map(*)?) as xs:string
Summary Transforms the document specified by $input, using the XSLT template specified by $stylesheet, and returns a map with the following keys:
  • result: The transformation result: A document node, or (if the result cannot be converted to XML) an item of type xs:untypedAtomic.
  • messages: Informational output generated by 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 xs:untypedAtomic.

The semantics of $params and $options is the same as for xslt:transform.
For the moment, messages can only be returned with recent versions of Saxon.

  • error (optional): An error string, which would be raised as an error by the other functions of this module.

Examples

Example 1: XSL transformation, with XML and XSL supplied as nodes

Query: <syntaxhighlight lang="xquery"> (: Outputs the result as html. :) declare option output:method 'html'; (: Turn whitespace chopping off. :) declare option db:chop 'no';

let $in :=

 <books>
   <book>
     <title>XSLT Programmer’s Reference</title> 
     <author>Michael H. Kay</author> 
   </book>
   <book>
     <title>XSLT</title> 
     <author>Doug Tidwell</author> 
     <author>Simon St. Laurent</author>
     <author>Robert Romano</author>
   </book>
 </books>

let $style :=

 <xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
 <xsl:output method='xml'/>
   <xsl:template match="/">

<html>

 <body>
     <xsl:for-each select='books/book'>
     • <xsl:apply-templates select='title'/>: <xsl:value-of select='author'/>
</xsl:for-each>
 </body>

</html>

   </xsl:template>
 </xsl:stylesheet>

return xslt:transform($in, $style)</syntaxhighlight> Result: <syntaxhighlight lang="xml"> <html>

 <body>
XSLT Programmer’s Reference: Michael H. Kay
XSLT: Doug Tidwell
 </body>

</html> </syntaxhighlight>

Example 2: Textual XSL transformation

Query: <syntaxhighlight lang="xquery"> xslt:transform-text(<dummy/>, 'basic.xslt') </syntaxhighlight>

basic.xslt <syntaxhighlight lang="xml"> <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

 <xsl:template match="/">123</xsl:template>

</xsl:stylesheet> </syntaxhighlight>

Result: <syntaxhighlight lang="xml">123</syntaxhighlight>

Example 3: XSL transformation with variable assignment

Query: <syntaxhighlight lang="xquery"> let $in := <dummy/> let $style := doc('variable.xsl') return xslt:transform($in, $style, map { "v": 1 }) </syntaxhighlight>

variable.xsl <syntaxhighlight lang="xslt"> <xsl:stylesheet version='1.0'

   xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
 <xsl:param name='v'/>
   <xsl:template match='/'>
     <v><xsl:value-of select='$v'/></v>
   </xsl:template>

</xsl:stylesheet> </syntaxhighlight>

Result: <syntaxhighlight lang="xml"> <v>1</v> <v>1</v> </syntaxhighlight>

Example 4: XSL transformation, yielding a result and info messages

Query: <syntaxhighlight 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>

) </syntaxhighlight>

Result: <syntaxhighlight lang="xquery"> map {

 "messages": ([<msg>START...</msg>], ["4 5 ...END"]),
 "result": <xml>123</xml>

} </syntaxhighlight>

Errors

Code Description
error An error occurred during the transformation process.

Changelog

Version 9.7
Version 9.2
  • Updated: Support for XML Catalog files added.
Version 9.0
Version 7.6
Version 7.3