Difference between revisions of "XSLT Module"

From BaseX Documentation
Jump to navigation Jump to search
Line 1: Line 1:
 
This module contains [[Querying#Functions|XQuery functions]] and variables to perform XSLT transformations. All functions are preceded by the <code>xslt:</code> prefix, which is linked to the <code>http://www.basex.org/modules/xslt</code> namespace.
 
This module contains [[Querying#Functions|XQuery functions]] and variables to perform XSLT transformations. All functions are preceded by the <code>xslt:</code> prefix, which is linked to the <code>http://www.basex.org/modules/xslt</code> namespace.
  
By default, this module uses the internal XSLT 1.0 implementation of Java to transform documents. XSLT 2.0 is used instead if Version 9.x of the [http://www.saxonica.com/ Saxon XSLT Processor] (<code>saxon9he.jar</code>, <code>saxon9pe.jar</code>, <code>saxon9ee.jar</code>) is found in the classpath.
+
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 [http://www.saxonica.com/ Saxon XSLT Processor] (<code>saxon9he.jar</code>, <code>saxon9pe.jar</code>, <code>saxon9ee.jar</code>) is found in the classpath. A custom transformer can be specified by overwriting the system property <code>javax.xml.transform.TransformerFactory</code>, as shown in the following Java example:
  
A [[XSLT Module (Snapshot)|preview page]] describes the features of the [http://files.basex.org/releases/latest/ latest stable snapshot].
+
<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);
 +
...
 +
ctx.close();
 +
</pre>
  
 
==$xslt:processor==
 
==$xslt:processor==
Line 12: Line 18:
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
|This variable contains the name of the applied XSLT processor (currently: <code>Java</code> or <code>Saxon</code>).<br />
+
|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").<br />
 
|}
 
|}
  
Line 22: Line 28:
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
|This variable contains the supported XSLT version (currently: <code>1.0</code> or <code>2.0</code>).<br />
+
|This variable contains the supported XSLT version (currently: "1.0" or "2.0"). "Unknown" is returned if a custom implementation was chosen.<br />
 
|}
 
|}
  
Line 32: Line 38:
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
|Transforms the document specified by <code>$input</code>, using the XSLT template specified by <code>$stylesheet</code>, and returns the result as <code>node()</code> instance. If Saxon is found in the Java classpath, <code>XSLT 2.0</code> is applied; otherwise, Java’s internal <code>XSLT 1.0</code> Xalan implementation is used. <code>$input</code> and <code>$stylesheet</code> can be specified as<br />
+
|Transforms the document specified by <code>$input</code>, using the XSLT template specified by <code>$stylesheet</code>, and returns the result as <code>node()</code> instance. <code>$input</code> and <code>$stylesheet</code> can be specified as<br />
 
* <code>xs:string</code>, containing the path to the document,
 
* <code>xs:string</code>, containing the path to the document,
 
* <code>xs:string</code>, containing the document in its string representation, or
 
* <code>xs:string</code>, containing the document in its string representation, or
Line 38: Line 44:
 
The <code>$params</code> argument can be used to bind variables to a stylesheet. It can be specified as
 
The <code>$params</code> argument can be used to bind variables to a stylesheet. It can be specified as
 
* <code>element(xslt:parameters)</code>: <code>&lt;xslt:parameters/&gt;</code> 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>&lt;xslt:parameters&gt;<br/>&nbsp;&nbsp;&lt;xslt:key1&gt;value1&lt;/xslt:key1&gt;<br/>&nbsp;&nbsp;...<br/>&lt;/xslt:parameters&gt;</code>
 
* <code>element(xslt:parameters)</code>: <code>&lt;xslt:parameters/&gt;</code> 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>&lt;xslt:parameters&gt;<br/>&nbsp;&nbsp;&lt;xslt:key1&gt;value1&lt;/xslt:key1&gt;<br/>&nbsp;&nbsp;...<br/>&lt;/xslt:parameters&gt;</code>
* [[Map_Functions|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.
+
* [[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.
|-
 
| valign='top' | '''Errors'''
 
|<b>[[XQuery Errors#BaseX Errors|BASX0011]]</b> is raised if the specified parameter is unknown.
 
 
|}
 
|}
  

Revision as of 17:08, 19 November 2011

This module contains XQuery functions and variables to perform XSLT transformations. All functions are preceded by the xslt: prefix, which is linked to the http://www.basex.org/modules/xslt namespace.

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();

$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.

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
  • xs:string, containing the path to the document,
  • xs:string, containing the document in its string representation, or
  • node(), containing the actual document.

The $params argument can be used to bind variables to a stylesheet. It can be specified as

  • element(xslt:parameters): <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:
    <xslt:parameters>
      <xslt:key1>value1</xslt:key1>
      ...
    </xslt:parameters>
  • map structure: all parameters can be directly represented as key/value pairs:
    map { "key1" := "value1", ... }
    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.

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:

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 :=
  <html xsl:version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='http://www.w3.org/1999/xhtml'>
    <body>
      <h1>Books</h1>
      <ul>
        <xsl:for-each select='books/book'>
        <li>
          <b><xsl:apply-templates select='title'/></b>: <xsl:value-of select='string-join(author, ", ")'/>
        </li>
        </xsl:for-each>
      </ul>
    </body>
  </html>
return xslt:transform($in, $style)

Result:

<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <h1>Books</h1>
    <ul>
      <li><b>XSLT Programmer´s Reference</b>: Michael H. Kay</li>
      <li><b>XSLT</b>: Doug Tidwell, Simon St. Laurent, Robert Romano</li>
    </ul>
  </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>