2014-09-04 46 views
1

我正在尝试为下面的xml文件(显然缩写)创建一个xpath表达式。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] 

所以我基本上是在寻找与节点比IDS在这种情况下,更大的4.2。虽然这似乎工作时,我玩它,我担心,我实际上并没有比较浮动浮动或双倍。如果我读XPATH 2.0正确的维基百科条目,好像它会施放属性为适当的类型:

如果没有模式是在使用中,该节点将是无类型,以及 类型所原子值将是untypedAtomic。键入的原子值是 检查以确保它们具有使用上下文 的适当类型:例如,不可能将 日期乘以数字。相比之下,非类型化的原子值会遵循一个弱的 输入规则:它们会自动转换为适用于它们的操作的 类型:例如,使用 算术运算,将无类型原子值转换为类型 double。

我已经做了很多的搜索,并没有发现任何明确的,但(我并不清楚,如果上面引述的语句适用于我的情况。)

+1

我觉得你很好。如果你想要一些明确的,正确的地方是规格,例如在http://www.w3.org/TR/xquery-operators/#comp.numeric – LarsH 2014-09-05 02:33:29

回答

1

首先,你真的需要清除这是XPath 1.0还是XPath 2.0(或XPath 2.0以向后兼容模式运行)。对于这个特定的例子,这些规则可能具有相同的效果,但它们表达的方式非常不同。

在XPath 1.0中,您将节点集与数字(= double)进行比较,如果节点集中的任何节点在转换为数字(= double)之后的结果大于4.2,则结果为true。如果节点集为空(即如果@id不存在),或者转换产生NaN(即如果@id不是数字),则结果为false。

在XPath 2.0中,假设数据是无类型的(即它不是模式感知处理器),您将比较节点序列和xs:decimal。节点被雾化,产生一系列xs:untypedAtomic值,为了比较的目的,这些节点被转换为xs:double(因为另一个操作数是数字)。再次,如果任何值大于4.2,答案是正确的。与XPath 1.0规则唯一有效的区别是,如果@id不是数字,则会失败,并且会出现动态错误,而XPath 1.0会给出“false”。

在启用了向后兼容性的XPath 2.0中,转换为double使用number()函数而不是转换,因此非数字@id值会转换为NaN,并且结果为false,因为它在XPath 1.0中。

+0

因此,如果我理解正确,我没有在我的例子中出现错误的事实表明我正在使用XPath 2.0。不幸的是,找到我正在使用的XPath版本(Visual Studio 2010,.NET 4)被证明比想象的更困难。 – stackbacker 2014-09-06 17:53:08

+0

我不明白你如何从我的帖子中得出推论。请再读一遍。我描述了XPath 1.0将产生结果的情况(不存在于源数据中),XPath 2.0将产生错误。由于您使用的是没有第三方库的Microsoft软件,因此您正在使用XPath 1.0。 – 2014-09-06 22:11:58

+0

对不起,我误解了你使用我的例子中的数字。我对XML/XPath很陌生。我想我的主要问题是,如果我的上面的例子是有效的,尤其是因为,正如你所指出的,我使用的是XPath 1.0。 – stackbacker 2014-09-07 00:44:59