XPath测试节点值是否为数字

时间:2010-10-04 10:28:23

标签: xpath

如何使用XPath检查节点值是否为数字?

有什么想法吗?

7 个答案:

答案 0 :(得分:116)

针对NaN测试价值:

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

这是一个较短的版本(感谢@Alejandro):

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

答案 1 :(得分:54)

测试变量$v中包含的值是否可以用作数字的最短方法是

number($v) = number($v)

您只需要将上面的$v替换为您要测试其值的表达式。

<强>解释

number($v) = number($v)显然是正确的,如果$v是数字,或者是表示数字的字符串。

对于布尔值也是如此,因为number(true())为1且number(false)为0。

每当$v无法用作数字时,number($v)就是NaN

和NaN不等于任何其他值,即使对自己也是如此。

因此,上述表达式仅适用于$v,其值可以用作数字,否则为false。

答案 2 :(得分:17)

您可以使用XPath 2.0中的一个惊人的类型测试运算符:

<xsl:if test="$number castable as xs:double">
    <!-- implementation -->
</xsl:if>

答案 3 :(得分:15)

我不是试图提供另一种替代解决方案,而是提出这个问题的“元视图”。

Oded和Dimitre Novatchev已经提供的答案是正确的,但人们真正用短语“价值是一个数字”的意思是,我怎么说,可以解释。

在某种程度上,这一切都来自这个奇怪的声音问题:“你想如何表达你的数值?”

XPath函数number()处理具有

的数字
  • 可能的前导或尾随空格
  • 前面的符号字符仅限于负值
  • dot 作为小数点分隔符(整数可选)
  • 范围[0-9]
  • 中的所有其他字符

请注意,这不包括

的数值表达式
  • 以指数形式(例如12.3E45)
  • 表示
  • 可能包含正值的符号字符
  • 区分正负零
  • 包括正无穷大或负无穷大的值

这些不仅仅是制定标准。具有根据模式的内容有效xs:float值的元素可能包含任何上述特征。但number()会返回值NaN

请回答您的问题“如果节点值是数字,我如何检查XPath?”是“使用已经提到的解决方案使用number()”或“使用单个XPath 1.0表达式,你不能”。考虑一下您可能遇到的可能的数字格式,如果需要,可以为验证/数字解析编写某种逻辑。在XSLT处理中,这可以通过几个合适的额外模板来完成,例如。

PS。如果您只关心非零数字,则最短的测试是

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

答案 4 :(得分:9)

我发现非常有用的是以下内容:

<xsl:choose>
  <xsl:when test="not(number(myNode))">
      <!-- myNode is a not a number or empty(NaN) or zero -->      
  </xsl:when>
  <xsl:otherwise>
      <!-- myNode is a number (!= zero) -->        
  </xsl:otherwise>
</xsl:choose>

答案 5 :(得分:1)

你总是可以使用这样的东西:

string(//Sesscode) castable as xs:decimal

castable由W3C here记录。

答案 6 :(得分:0)

我一直在处理01-是数字。

string(number($v)) != string($v)进行隔离