如何使用XPath检查节点值是否为数字?
有什么想法吗?
答案 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()
处理具有
请注意,这不包括
的数值表达式这些不仅仅是制定标准。具有根据模式的内容有效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)
答案 6 :(得分:0)
我一直在处理01-是数字。
string(number($v)) != string($v)
进行隔离