XPath测试节点值是否为number

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

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

有什么想法吗?

根据以下内容测试值:


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


测试变量
$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)
  • 可能包含正值的符号字符
  • 区分正零和负零
  • 包含正无穷大或负无穷大的值
这些不仅仅是制定的标准。一个元素的内容符合模式a的有效
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.0
NaN
中,数字数据类型的值不等于任何数字值,为了进行比较,如果至少有一个参数是数字数据类型的,那么另一个参数被强制转换为数字,这是最短的数字测试:
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>