我已经测试样式表
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs"
version="2.0">
<xsl:function name="mf:f1" as="node()*">
<xsl:param name="input"/>
<xsl:param name="bar"/>
<xsl:message select="'f1 called'"/>
<xsl:sequence select="$input//foo[bar = $bar]"/>
</xsl:function>
<xsl:function name="mf:f2" as="node()*">
<xsl:param name="input"/>
<xsl:param name="baz"/>
<xsl:message select="'f2 called'"/>
<xsl:sequence select="$input//foo[baz = $baz]"/>
</xsl:function>
<xsl:variable name="a" select="mf:f1(/, 'bar 1')"/>
<xsl:variable name="b" select="mf:f2(/, 'baz 1')"/>
<xsl:template match="/">
<xsl:sequence select="if ($a) then $a else $b"/>
</xsl:template>
</xsl:stylesheet>
与输入
<root>
<foo>
<bar>bar 1</bar>
<baz>baz a</baz>
</foo>
<foo>
<bar>bar 2</bar>
<baz>baz 1</baz>
</foo>
</root>
与撒克逊9.6 HE和输出是
f1 called
<?xml version="1.0" encoding="UTF-8"?><foo>
<bar>bar 1</bar>
<baz>baz a</baz>
</foo>
随着样式表
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs"
version="2.0">
<xsl:function name="mf:f1" as="node()*">
<xsl:param name="input"/>
<xsl:param name="bar"/>
<xsl:message select="'f1 called'"/>
<xsl:sequence select="$input//foo[bar = $bar]"/>
</xsl:function>
<xsl:function name="mf:f2" as="node()*">
<xsl:param name="input"/>
<xsl:param name="baz"/>
<xsl:message select="'f2 called'"/>
<xsl:sequence select="$input//foo[baz = $baz]"/>
</xsl:function>
<xsl:variable name="a" select="mf:f1(/, 'bar 1')"/>
<xsl:variable name="b" select="mf:f2(/, 'baz 1')"/>
<xsl:template match="/">
<xsl:sequence select="if ($b) then $b else $a"/>
</xsl:template>
</xsl:stylesheet>
输出
f2 called
<?xml version="1.0" encoding="UTF-8"?><foo>
<bar>bar 2</bar>
<baz>baz 1</baz>
</foo>
,当我更改代码以
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs"
version="2.0">
<xsl:function name="mf:f1" as="node()*">
<xsl:param name="input"/>
<xsl:param name="bar"/>
<xsl:message select="'f1 called'"/>
<xsl:sequence select="$input//foo[bar = $bar]"/>
</xsl:function>
<xsl:function name="mf:f2" as="node()*">
<xsl:param name="input"/>
<xsl:param name="baz"/>
<xsl:message select="'f2 called'"/>
<xsl:sequence select="$input//foo[baz = $baz]"/>
</xsl:function>
<xsl:variable name="a" select="mf:f1(/, 'bar x')"/>
<xsl:variable name="b" select="mf:f2(/, 'baz 1')"/>
<xsl:template match="/">
<xsl:sequence select="if ($a) then $a else $b"/>
</xsl:template>
</xsl:stylesheet>
那么这两个函数的调用:
f1 called
f2 called
<?xml version="1.0" encoding="UTF-8"?><foo>
<bar>bar 2</bar>
<baz>baz 1</baz>
</foo>
请考虑告诉我们具体使用哪个Saxon版本,然后确定函数具有哪种返回类型,以及如何确定计算出“b”。 –
XSLT显然使用懒惰的评估:http://stackoverflow.com/questions/1410057/xsl-does-evaluating-conditional-expressions-shortcut。但它可能不适用于函数,它的返回值分配给一个变量。你是否在'b'的xsl:variable'附近尝试了'if/then' /'xsl:choose'? – CoDEmanX
我读了你的建议,把全局变量变成本地变量,导致失效。你能澄清吗? – jdk