如果节点值是数字,则XPathtesting

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

有任何想法吗?

testing对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> 

testingvariables$v包含的值是否可用作数字的最短可能方法是

 number($v) = number($v) 

您只需将上面的$vreplace为您想要testing的值即可。

说明

number($v) = number($v)显然是真的,如果$v是一个数字,或者是一个代表数字的string。

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

只要$v不能用作数字,那么number($v)就是NaN

NaN不等于任何其他价值,甚至不等于自身。

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

您可以使用XPath 2.0中的一个令人惊叹的typestesting运算符:

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

我并没有试图提供另一种替代解决scheme,而是对这个问题的“元视图”。

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

从某种意义上来说,这个奇怪的问题就是: “你想怎么expression你的数值?”

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

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

请注意,这不包括数值expression式

  • 以指数forms表示(例如12.3E45)
  • 可能包含正值的符号字符
  • 正面和负面之间有区别
  • 包括正值或负值的无穷大值

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

因此,回答你的问题:“如果节点值是数字,我如何检查XPath?” 是“使用number()已经提到的解决scheme”或“与一个XPath 1.0expression式,你不能”。 想想你可能遇到的数字格式,如果需要的话,写一些validation/数字parsing的逻辑。 在XSLT处理中,这可以通过less量合适的额外模板来完成。

PS。 如果你只关心非零数字,最短的testing是

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

我发现非常有用的是以下几点:

 <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> 

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

 string(//Sesscode) castable as xs:decimal 

W3C 在这里logging了浇注材料。