这是一个可由 Saxonica 的 SaxonCS 运行的 XSLT 4 示例:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="4.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="text"/>
<xsl:mode on-no-match="shallow-skip"/>
<xsl:strip-space elements="*"/>
<xsl:param name="operator-map" as="map(xs:string, xs:string)"
select="map { 'minus' : ' - ',
'plus' : ' + ',
'times' : ' * ' }"/>
<xsl:template match="Expression">
<xsl:variable name="expression">
<xsl:apply-templates/>
</xsl:variable>
<xsl:variable name="result" as="xs:decimal">
<xsl:evaluate xpath="$expression"/>
</xsl:variable>
<xsl:value-of select="$expression, $result" separator=" = "/>
</xsl:template>
<xsl:template match="minus | plus | times">
<xsl:text>(</xsl:text>
<xsl:apply-templates separator="{$operator-map(local-name())}"/>
<xsl:text>)</xsl:text>
</xsl:template>
<xsl:template match="int[@value]">
<xsl:value-of select="@value"/>
</xsl:template>
</xsl:stylesheet>
或作为 XSLT 3:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="text"/>
<xsl:mode on-no-match="shallow-skip"/>
<xsl:strip-space elements="*"/>
<xsl:param name="operator-map" as="map(xs:string, xs:string)"
select="map { 'minus' : ' - ',
'plus' : ' + ',
'times' : ' * ' }"/>
<xsl:template match="Expression">
<xsl:variable name="expression">
<xsl:apply-templates/>
</xsl:variable>
<xsl:variable name="result" as="xs:decimal">
<xsl:evaluate xpath="$expression"/>
</xsl:variable>
<xsl:value-of select="$expression, $result" separator=" = "/>
</xsl:template>
<xsl:template match="minus | plus | times">
<xsl:if test="position() gt 1"> {$operator-map(local-name(..))} </xsl:if>
<xsl:text>(</xsl:text>
<xsl:apply-templates/>
<xsl:text>)</xsl:text>
</xsl:template>
<xsl:template match="int[@value]">
<xsl:if test="position() gt 1"> {$operator-map(local-name(..))} </xsl:if>
<xsl:value-of select="@value"/>
</xsl:template>
</xsl:stylesheet>
XQuery (3) 中的单独评估可能为
declare function local:evaluate($expression)
{
local:evaluate-operator($expression/(* except description))
};
declare function local:evaluate-operator($operator)
{
typeswitch ($operator)
case element(minus)
return fold-left(tail($operator/*), local:evaluate-operator(head($operator/*)), function($a, $op) { $a - local:evaluate-operator($op) })
case element(plus)
return sum($operator/*!local:evaluate-operator(.))
case element(times)
return fold-left($operator/*, 1, function($a, $op) { $a * local:evaluate-operator($op) })
case element(int)
return xs:integer($operator/@value)
default return ()
};
local:evaluate(Expression)