XPath测试节点值是否为数字

Har*_*OTA 87 xpath

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

有任何想法吗?

Ode*_*ded 120

根据NaN测试值:

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

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

<xsl:if test="number(myNode) = myNode">
    <!-- myNode is a number -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)

  • 因为在XPath 1.0中,数字数据类型的"NaN"值不等于任何数值,并且为了比较,如果至少一个参数是数字数据类型,则另一个被转换为数字,这是最短的数字测试:`number( MYNODE)= MyNode` (10认同)
  • 由于=运算符上的类型不匹配,@ Alejandro的简短版本完全失败,因为'='的第一个操作数的必需项类型是数字;提供的值有项类型xs:string;`,Dimitre的解决方案工作正常然而. (9认同)

Dim*_*hev 55

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

number($v) = number($v)
Run Code Online (Sandbox Code Playgroud)

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

说明:

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

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

无论什么时候$v都不能用作数字,那number($v)就是NaN

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

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


sha*_*piy 18

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

<xsl:if test="$number castable as xs:double">
    <!-- implementation -->
</xsl:if>
Run Code Online (Sandbox Code Playgroud)


jas*_*sso 15

我不是试图提供另一种替代解决方案,而是对这个问题的"元视图".

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

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

XPath函数number()处理具有的数字

  • 可能的前导或尾随空格
  • 前面的符号字符仅在负值上
  • 作为小数点分隔符(整数可选)
  • 范围[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>
Run Code Online (Sandbox Code Playgroud)


小智 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>
Run Code Online (Sandbox Code Playgroud)