4

我有一个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陈述中添加内容吗?

4

3 回答 3

5

这完全符合XPath 规范

根据定义boolean(0)false()

你想要

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

说明

number($x) = number($x)

正是true()何时$x可转换为一个数字。

如果$x不能转换为数字,则上述比较的两边都评估为NaN,并且根据定义NaN不等于任何值,包括NaN.

注意

如果您想检查是否$varinteger,请使用:

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

或者,或者:

<xsl:if test="not(translate($var, '0123456789', ''))">
  <node att="{$var}" />
</xsl:if>
于 2012-04-28T22:33:32.417 回答
2

如果节点值为数字,则取自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) 被评估为布尔值 false() - 因为根据定义

布尔值(0)为假()

于 2012-04-28T21:49:38.070 回答
1

在 XPath 2.0 中,尝试使用诸如$var castable as xs:integeror之类的表达式$var castable as xs:double

于 2012-04-29T07:48:00.907 回答