XPath测试节点值是否为number
如何使用XPath检查节点值是否为数字 有什么想法吗?根据以下内容测试值:XPath测试节点值是否为number,xpath,Xpath,如何使用XPath检查节点值是否为数字 有什么想法吗?根据以下内容测试值: 这是一个较短的版本(谢谢): 测试变量$v中包含的值是否可用作数字的最短方法是: number($v) = number($v) 只需将上面的$v替换为要测试其值的表达式 说明: number($v) = number($v) number($v)=number($v)显然是正确的,如果$v是一个数字,或者是一个表示数字的字符串 布尔值也是如此,因为number(true())是1,而number(false)是
这是一个较短的版本(谢谢):
测试变量
$v
中包含的值是否可用作数字的最短方法是:
number($v) = number($v)
只需将上面的$v
替换为要测试其值的表达式
说明:
number($v) = number($v)
number($v)=number($v)
显然是正确的,如果$v
是一个数字,或者是一个表示数字的字符串
布尔值也是如此,因为number(true())
是1,而number(false)
是0
当$v
不能用作数字时,则数字($v)
为NaN
NaN不等于任何其他值,甚至不等于它本身
因此,上述表达式仅适用于其值可以用作数字的
$v
,否则为false。我不想提供另一种替代解决方案,而是针对这个问题提供一个“元视图”
Oded和Dimitre Novatchev已经给出的答案是正确的,但人们对“价值是一个数字”这句话的真正含义,我怎么说,是可以解释的
在某种程度上,这一切都归结为一个听起来很奇怪的问题:“您想如何表达您的数值?”
XPath函数number()
处理具有
- 可能的前导或尾随空格
- 仅在负值上使用前面的符号字符
- 小数点分隔符(整数可选)
- [0-9]范围内的所有其他字符
- 以指数形式表示(例如12.3E45)
- 可能包含正值的符号字符
- 区分正零和负零
- 包含正无穷大或负无穷大的值
xs:float
值,该元素可能包含上述任何特征。然而number()
将返回值NaN
所以,对于您的问题“如果节点值是number,我如何使用XPath进行检查?”的答案是“使用前面提到的使用number()
”的解决方案,或者“对于单个XPath 1.0表达式,您不能”。考虑可能遇到的数字格式,如果需要,编写某种验证/数字解析逻辑。例如,在XSLT处理中,这可以通过使用少量合适的额外模板来完成
如果你只关心非零数字,最短的测试是
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
您可以随时使用以下内容:
string(//Sesscode) castable as xs:decimal
W3C对浇注料进行了记录。我发现非常有用的是:
<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>
在XPath 2.0中有一个惊人的类型测试操作符,您可以使用:
<xsl:if test="$number castable as xs:double">
<!-- implementation -->
</xsl:if>
我一直在处理01-这是一个数字
string(数字($v))!=字符串($v)
进行隔离,因为在XPath 1.0NaN
中,数字数据类型的值不等于任何数字值,为了进行比较,如果至少有一个参数是数字数据类型的,那么另一个参数被强制转换为数字,这是最短的数字测试:number(MyNode)=MyNode
由于=运算符上的类型不匹配,@Alejandro的简短版本在XPath 2.0中完全失败(“=”的第一个操作数的必需项类型为数字;提供的值具有项类型xs:string;
),但是Dimitre的解决方案工作正常。+1有用的解释。有人能评论一下number($v)=number($v)
与number($v)=$v(
)产生不同结果的案例吗?@LarsH:我已经对这些案例进行了评论。你能指出一个尚未讨论过的案例吗?我的意思是,有人能列出number($v)=number($v)
与number($v)=$v产生不同结果的案例吗?毫无疑问,这是从你写的东西中衍生出来的,但我看不出你在哪里明确地解决了这个问题。对不起,我说的太多了。瞧,你的解决方案和@Oded's/@Alejandro的解决方案总是产生相同的结果吗?@LarsH:我没有看过Oded的解决方案,因为它显然是我不想使用的。我认为Al2jandro的解决方案和我的解决方案给出了相同的答案$v@EricS,似乎只有通过购买它才能访问IEEE标准。。。比亚迪请看这里:。特别是这一段:“IEEE 754为涉及NaN的所有关系表达式赋值。在C的语法中,谓词x!=y为真,但当x或y或两者均为NaN时,所有其他的xy均为假”+1对问题背后的问题进行了详细的解释:如果OP知道该问什么,他可能意味着什么或会意味着什么。
<xsl:if test="$number castable as xs:double">
<!-- implementation -->
</xsl:if>