71 lines
2.5 KiB
Markdown
71 lines
2.5 KiB
Markdown
# Higher-Order XSL
|
|
hoxsl is a library for XSLT 2.0, written in pure XSLT, introducing
|
|
various types of higher-order logic; this includes higher-order
|
|
functions and XSLT templates that take XSLT as input and produce XSLT
|
|
as output.
|
|
|
|
The system is fully tested---see the test cases for additional
|
|
documentation as this project gets under way.
|
|
|
|
|
|
## Higher-Order Functions
|
|
[Higher-order functions][xslt-30-ho] are a part of XSLT 3.0, but
|
|
implementations that support them (such as Saxon) hide it behind
|
|
proprietary versions of their software. Others still may wish to
|
|
continue using XSLT 2.0.
|
|
|
|
There are various approaches/kluges for this problem in earlier
|
|
versions of XSLT; this implementation is motivated by Dimitre
|
|
Novatchev's work on [higher-order functions in FXSL][nova-ho].
|
|
|
|
For example, consider an implementation of a filter function that
|
|
accepts a node set and a predicate:
|
|
|
|
```xml
|
|
<xsl:function name="my:filter" as="xs:element()*">
|
|
<xsl:param name="nodes" as="xs:element()*" />
|
|
<xsl:param name="pred" />
|
|
|
|
<xsl:for-each select="$nodes">
|
|
<xsl:if test="f:apply( $pred, . )">
|
|
<xsl:sequence select="." />
|
|
</xsl:if>
|
|
</xsl:for-each>
|
|
</xsl:function>
|
|
|
|
|
|
<xsl:function name="my:pred" as="xs:boolean">
|
|
<xsl:param name="node" as="element()" />
|
|
|
|
<xsl:sequence select="$node/@foo = 'true'" />
|
|
</xsl:function>
|
|
```
|
|
|
|
We could then apply a filter using this predicate like so:
|
|
|
|
```xml
|
|
<sequence select="my:filter( $nodes, my:pred() )" />
|
|
```
|
|
|
|
hoxsl takes this a step further by providing a stylesheet to generate
|
|
the boilerplate necessary for functions to be able to be applied using
|
|
`f:apply`, as shown above. Applying `tranform/apply-gen.xsl` to the
|
|
XSL stylesheet containing the above function definitions would produce
|
|
output that can be directly imported (as a stylesheet); no additional
|
|
work is needed. This can be included as part of a build process, and
|
|
the output included within a distribution.
|
|
|
|
|
|
## License
|
|
This program is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the Free
|
|
Software Foundation, either version 3 of the License, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
[nova-ho]: http://conferences.idealliance.org/extreme/html/2006/Novatchev01/EML2006Novatchev01.html
|
|
[xslt-30-ho]: http://www.w3.org/TR/xslt-30/#dt-higher-order-operand
|