我有一个xsl:variable
可以是空字符串或数字。所以我这样评价它:
<xsl:if test="number($var)"><node att="{number($var)}" /></xsl:if>
如果var
是空字符串,则此方法有效,但如果0
var
则具有相同的效果:
从 -2 到 2:
<node att="-2" />
<node att="-1" />
<node att="1" />
<node att="2" />
这是一个错误吗?是否有不同版本的number
函数也可以捕获0
?我真的需要在test
语句中添加or $var = '0'
吗?
这完全符合 XPath 规范:
根据定义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
不等于任何值,包括NaN
。
注:
如果您想检查$var
是否为整数,请使用:
<xsl:if test="floor($var) = $var">
<node att="{$var}" />
</xsl:if>
或者,或者:
<xsl:if test="not(translate($var, '0123456789', ''))">
<node att="{$var}" />
</xsl:if>
节点值为数字
,则取自 XPath 测试针对 NaN 测试值:
<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)">
表达式 number(0) 的计算值为 Boolean false() -- 因为根据定义
布尔值 (0) 为假 ()
在 XPath 2.0 中,尝试使用 $var castable as xs:integer
或 $var castable as xs:double
等表达式。