如果节点值是数字,则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)
您只需将上面的$v
replace为您想要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了浇注材料。