为什么我从此模板返回值为真:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template name="return-false">
<xsl:value-of select="false()"/>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:variable name="call-template">
<xsl:call-template name="return-false"/>
</xsl:variable>
<xsl:if test="$call-template = true()">
<FALSE/>
</xsl:if>
</root>
</xsl:template>
</xsl:stylesheet>
&#13;
答案 0 :(得分:5)
xsl:value-of
指令创建一个文本节点。
<xsl:value-of select="false()"/>
返回false()
函数的字符串值,这是字符串&#34; false&#34;。因此,$call-template
变量的内容是一个包含字符串&#34; false&#34;的文本节点。
http://www.w3.org/TR/xslt/#value-of
接下来,测试test="$call-template = true()"
返回true()
,因为:
true()
。 答案 1 :(得分:1)
针对值'true'
或'false'
而不是函数进行测试,它可以正常运行。你为什么这样做呢?你想要实现什么目标?使用call-template
返回布尔值更多是程序性的事情,并且可能不适合XSLT的更多功能/声明性模型。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template name="return-false">
<xsl:value-of select="false()"/>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:variable name="call-template">
<xsl:call-template name="return-false"/>
</xsl:variable>
<xsl:if test="$call-template = 'true'">
<FALSE/>
</xsl:if>
</root>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
请注意,在XSLT 2.0和3.0中,模板或函数可以返回布尔值但不使用value-of
,而是使用sequence
,例如。
<xsl:template name="return-false">
<xsl:sequence select="false()"/>
</xsl:template>
当然,通常你不会返回一个布尔常量值,而只是简单地评估比较,例如
<xsl:template name="check">
<xsl:param name="input"/>
<xsl:sequence select="matches($input, 'foo')"/>
</xsl:template>
当然,要以紧凑的形式使用此类代码,您可以编写一个函数
<xsl:function name="mf:check">
<xsl:param name="input"/>
<xsl:sequence select="matches($input, 'foo')"/>
</xsl:function>
并用例如<xsl:variable name="check1" select="mf:check('foobar')"/>
分别为<xsl:if test="mf:check('foobar')">..</xsl:if>
。