2010-06-03 53 views
6

为什么测试= “” 一个布尔总是返回true

<xsl:if test="<XPATH to boolean value here>"> 
... 
</xsl:if> 

始终返回true?

由于根据定义布尔值可以是0,1,“false”和“true”,测试布尔值的唯一方法是对这些进行字符串比较。这不可能是正确的。

+0

请问您可以使用XML片段发布您当前的XPath表达式吗? – 2010-06-03 20:15:49

+0

这根本不是问题。请给出一个具体示例 - 什么是XPath表达式,以及什么是评估此XPath表达式的XML文件(请尽可能最简单)? – 2010-06-04 16:15:38

+0

想要看一个例子,我想在语法中有一个小小的错误。 – 2010-06-07 06:34:35

回答

8

<xsl:if>作品指定若叫boolean功能test。此功能无法按照您的想法操作。如果它的参数计算为一个节点集(如果你使用路径作为它的参数),它将返回true,如果节点集不为空,否则返回false。实际上,你正在测试一个元素的存在,而不是它的价值。如果foo包含false

<xsl:if test="/path/to/foo"> 

将始终为true,因为你实际上在该测试要求是“没有这个元素存在吗?”而不是“元素的价值是真的吗?”元素存在。

是布尔值必须truefalse1,或0是XML模式(which see),而不是XPath,它不知道这个规则另有规定的部分规则。 (XPath 1.0,即XPath 2.0/XQuery 1.0有the fn:boolean function,它确实聪明,也就是XML模式感知,评估布尔值)。要确定XSLT中的值是否为真,必须明确检查它:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

如果我正确阅读http://www.w3.org/TR/xpath/#section-Boolean-Functions,那么这两个测试之间应该没有区别。实际上,xsl:if被指定为通过调用布尔函数来转换测试结果。 – 2010-06-04 22:24:11

+0

你知道,我知道。纠正。 – 2010-06-05 16:40:50

+0

在上例中,一旦您使用了架构感知处理器,就会遇到问题。由于处理器从架构知道/ path/to/foo是xs:boolean,它将产生一条错误消息“不能比较xs:boolean到xs:string”。我有这个问题(具有布尔属性) - 我真的不知道如何解决它。任何帮助? – 2011-05-11 17:04:59

0

xpath规范给出了布尔函数。因此布尔(值)将始终返回true或false。