我有xsl:variable
,可以是空字符串或数字。所以我这样评价:
<xsl:if test="number($var)"><node att="{number($var)}" /></xsl:if>
如果var
为空字符串,则此方法有效,但如果var
为0
,则效果相同:
从-2到2:
<node att="-2" />
<node att="-1" />
<node att="1" />
<node att="2" />
这是一个错误吗?是否有number
函数的不同版本也会捕获0
?我是否真的必须将or $var = '0'
添加到我的test
声明中?
答案 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
等表达式。