当被告知返回false时,模板返回true()

时间:2015-11-20 15:19:10

标签: xml xslt xpath

为什么我从此模板返回值为真:



<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;
&#13;
&#13; 猜猜我在输出文档 FALSE元素上得到了什么。我想知道我应该哭泣还是应该嘲笑我在这个简单例子上的斗争。我的挫败感袭击了天空。

3 个答案:

答案 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()

http://www.w3.org/TR/xpath/#booleans

答案 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>