Difference between revisions of "XSLT Module"
Line 51: | Line 51: | ||
The {{Code|$params}} argument can be used to bind variables to a stylesheet. It can be specified as | The {{Code|$params}} argument can be used to bind variables to a stylesheet. It can be specified as | ||
* {{Code|element(xslt:parameters)}}: {{Code|<xslt:parameters/>}} must be used as root element, and the parameters are specified as child nodes, with the element name representing the key and the text node representing the value:<br />{{Code|<xslt:parameters><br/> <xslt:key1>value1</xslt:key1><br/> ...<br/></xslt:parameters>}} | * {{Code|element(xslt:parameters)}}: {{Code|<xslt:parameters/>}} must be used as root element, and the parameters are specified as child nodes, with the element name representing the key and the text node representing the value:<br />{{Code|<xslt:parameters><br/> <xslt:key1>value1</xslt:key1><br/> ...<br/></xslt:parameters>}} | ||
− | * [[Map Module|map structure]]: all parameters can be directly represented as key/value pairs:<br /><code> | + | * [[Map Module|map structure]]: all parameters can be directly represented as key/value pairs:<br /><code>map { "key1" := "value1", ... }</code><br/>This variant is more compact, and it facilitates the binding of arbitrary data types. Note that only strings are supported when using Saxon (XSLT 2.0). Next, the map structures are not part of the XQuery language yet, as the standardization is still in progress. |
|} | |} | ||
Revision as of 23:51, 26 May 2012
This XQuery Module contains functions and variables to perform XSLT transformations. By default, this module uses Java’s XSLT 1.0 Xalan implementation to transform documents. XSLT 2.0 is used instead if Version 9.x of the Saxon XSLT Processor (saxon9he.jar
, saxon9pe.jar
, saxon9ee.jar
) is found in the classpath. A custom transformer can be specified by overwriting the system property javax.xml.transform.TransformerFactory
, as shown in the following Java example:
System.setProperty("javax.xml.transform.TransformerFactory", "org.custom.xslt.TransformerFactoryImpl"); Context ctx = new Context(); String result = new XQuery("xslt:transform('...', '...')").execute(ctx); ... ctx.close();
Contents
Conventions
All functions in this module are assigned to the http://basex.org/modules/xslt
namespace, which is statically bound to the xslt
prefix.
All errors are assigned to the http://basex.org/errors
namespace, which is statically bound to the bxerr
prefix.
Variables
$xslt:processor
Signatures | $xslt:processor as xs:string |
Summary | This variable contains 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 | This variable contains the supported XSLT version (currently: "1.0" or "2.0"). "Unknown" is returned if a custom implementation was chosen. |
Functions
xslt:transform
Signatures | xslt:transform($input as item(), $stylesheet as item()) as node() xslt:transform($input as item(), $stylesheet as item(), $params as item()) as node()
|
Summary | Transforms the document specified by $input , using the XSLT template specified by $stylesheet , and returns the result as node() instance. $input and $stylesheet can be specified as
The
|
Examples
Example 1: Basic XSL transformation with dummy document and without parameters
Query:
xslt:transform(<dummy/>, 'basic.xslt')
basic.xslt
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/"> <result/> </xsl:template> </xsl:stylesheet>
Result:
<result/>
Example 2: XSLT transformation of an input document
Query:
(: 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='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:output method='xml'/> <xsl:template match="/"> <html> <body> <div> <xsl:for-each select='books/book'> • <b><xsl:apply-templates select='title'/></b>: <xsl:value-of select='author'/><br/> </xsl:for-each> </div> </body> </html> </xsl:template> </xsl:stylesheet> return xslt:transform($in, $style)
Result:
<html> <body> <div> • <b>XSLT Programmer’s Reference</b>: Michael H. Kay<br> • <b>XSLT</b>: Doug Tidwell<br> </div> </body> </html>
Example 3: Assigning a variable to an XSLT stylesheet
Query:
let $in := <dummy/> let $style := doc('variable.xsl') return ( xslt:transform($in, $style, <xslt:parameters><xslt:v>1</xslt:v></xslt:parameters>), xslt:transform($in, $style, map { "v" := 1 }) )
variable.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>
Result:
<v>1</v> <v>1</v>