xpath:number为“0”返回false

时间:2012-04-28 21:37:42

标签: xslt xpath numbers xslt-1.0

我有xsl:variable,可以是空字符串或数字。所以我这样评价:

<xsl:if test="number($var)"><node att="{number($var)}" /></xsl:if>

如果var为空字符串,则此方法有效,但如果var0,则效果相同:

从-2到2:

<node att="-2" />
<node att="-1" />
<node att="1" />
<node att="2" />

这是一个错误吗?是否有number函数的不同版本也会捕获0?我是否真的必须将or $var = '0'添加到我的test声明中?

3 个答案:

答案 0 :(得分:5)

这完全符合XPath specification

根据定义boolean(0)false()

你想要

<xsl:if test="number($var) = number($var)">
  <node att="{number($var)}" />
</xsl:if>

<强>解释

number($x) = number($x)
true()可以转换为数字时,

恰好是$x

如果$x无法转换为数字,则上述comaparison的双方评估为NaN,并且根据定义NaN不等于任何值,包括{{ 1}}。

注意

如果您想检查NaN是否整数,请使用:

$var

或者,或者:

<xsl:if test="floor($var) = $var">
  <node att="{$var}" />
</xsl:if>

答案 1 :(得分:2)

取自XPath test if node value is number
根据{{​​3}}测试值:

<xsl:if test="string(number(myNode)) != 'NaN'">
    <!-- myNode is a number -->
</xsl:if>

这是一个较短的版本:

<xsl:if test="number(myNode) = myNode">
    <!-- myNode is a number -->
</xsl:if>



<xsl:if test="number(0)">

表达式编号(0)被计算为布尔值false() - 因为根据定义

boolean(0)为false()

答案 2 :(得分:1)

在XPath 2.0中,尝试使用$var castable as xs:integer$var castable as xs:double等表达式。