我正试图为以下xml文件创建一个xpath表达式(显然缩写为)。
<estimate>
<heights id="4.1">
<year>1985</year>
</heights>
<heights id="4.2">
<year>1986</year>
</heights>
<heights id="4.3">
<year>1987</year>
</heights>
.
.
.
<heights id="x.x">
<year>XXXX</year>
</heights>
</estimate>
我使用的xpath表达式是:
/estimate/heights[@id>4.2]
所以在这种情况下,我基本上是在寻找id大于4.2的节点。虽然当我玩它的时候,这似乎很有效,但我担心我并没有真正将float与float或doubledouble进行比较。如果我正确阅读了XPATH 2.0的维基百科条目,它似乎会将属性转换为适当的类型:
如果没有使用任何架构,则节点将是非类型化的得到的原子值将是非类型原子。键入的原子值为检查以确保它们具有适合上下文的类型它们的使用位置:例如,不可能将用数字表示日期。相比之下,未键入的原子值遵循弱键入规程:它们会自动转换为类型适用于使用它们的操作:例如算术运算将未类型化的原子值转换为类型双重的
我已经做了很多搜索,但没有找到任何明确的内容(我不清楚上面引用的陈述是否适用于我的案例。)
首先,您确实需要弄清楚这是XPath1.0还是XPath2.0(或者在向后兼容模式下运行的XPath2.0)。对于这个特定的例子,规则可能具有大致相同的效果,但它们的表达方式非常不同。
在XPath1.0中,您将节点集与数字(=double)进行比较,如果节点集中的任何节点在转换为数字(=double)后大于4.2,则结果为true。如果节点集为空(即,如果@id不存在),或者如果转换产生NaN(即,@id不是数字),则结果为false。
在XPath2.0中,假设数据是非类型化的(也就是说,它不是一个模式感知处理器),则将节点序列与xs:decimal进行比较。节点被原子化,生成一系列xs:untypedAtomic值,为了进行比较,这些值被强制转换为xs:double(因为另一个操作数是数字)。同样,如果任何值大于4.2,则答案为真。与XPath1.0规则唯一有效的区别是,如果@id不是数字,则强制转换失败,并得到一个动态错误,而XPath1.0给出的是"false"。
在启用向后兼容性的XPath2.0中,转换为双精度使用number()函数,而不是强制转换,因此非数字的@id值被转换为NaN,结果与XPath1.0中一样为false。