【发布时间】:2010-09-25 15:56:00
【问题描述】:
我对 XSLT 完全陌生,无法弄清楚以下代码哪里出了问题。
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
当它应该为假时,它总是返回真。为什么?
【问题讨论】:
标签: xml xslt boolean xslt-1.0 xslt-2.0
我对 XSLT 完全陌生,无法弄清楚以下代码哪里出了问题。
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
当它应该为假时,它总是返回真。为什么?
【问题讨论】:
标签: xml xslt boolean xslt-1.0 xslt-2.0
在这个阶段可能有点晚了,但 imo 处理布尔值是不值得的。以下是我如何处理从数据库返回的布尔值(强制):
<xsl:variable name="vTrue" select="true()"/>
<xsl:choose>
<xsl:when test="string(Mandatory) = string($vTrue)">
<xsl:text>Mandatory</xsl:text>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
希望这对某人有所帮助
【讨论】:
$var 变量的值定义在:
<xsl:variable name="var" select="boolean('false')"/>
是
true()
这是因为在 XPath 中“false”是一个普通字符串,而不是 false(),后者是 boolean 值 false() 的构造函数
XPath 中的两个布尔值是(注意它们是构造的!):
true() 和 false()
XPath Spec 中详细说明了将任何值转换为布尔值的详细信息。:
"boolean 函数将其参数转换为布尔值,如下所示:
一个数为真当且仅当它 既不是正零也不是负零 也不是 NaN
一个节点集为真当且仅当它 非空
一个字符串为真当且仅当它 长度不为零
四种基本类型以外的类型的对象以依赖于该类型的方式转换为布尔值 "
在您的情况下,字符串“false”不是数字 0 并且具有正长度,因此应用上面第 3 条中的规则,产生true()。
因此,要在 XSLT 1.0 中定义一个变量,其值为 false(),需要编写如下定义:
<xsl:variable name="vMyVar" select="false()"/>
或者,如果您不完全记得这一点,您可以随时写:
<xsl:variable name="vMyVar" select="1 = 0"/>
(指定任何计算结果为false() 的表达式),XSLT 处理器将为您完成工作。
在 XSLT 2.0 中,最好明确指定变量的类型:
<xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>
【讨论】:
false 和true 字符串,是否有一个简洁的解决方案?
您正在使用的 boolean() 函数确实在发挥作用。要使用明确的真假值,您应该使用以下函数:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
仅供参考,根据MSDN documentation,boolean() 返回以下内容:
【讨论】: