Xml 在XPath 2.0中使用min()或max()时的更多条件
为什么在XPath 2.0中尝试将Union运算符与“min()”或“max()”函数一起使用时会出现错误?我正在处理的XML有一个名为“quantity”的对象,其形式如下:Xml 在XPath 2.0中使用min()或max()时的更多条件,xml,xpath,soapui,Xml,Xpath,Soapui,为什么在XPath 2.0中尝试将Union运算符与“min()”或“max()”函数一起使用时会出现错误?我正在处理的XML有一个名为“quantity”的对象,其形式如下: <quantity> <new> <value> 18.0 </value> </new> <old> <value> 27.5 </value> </old> </
<quantity>
<new>
<value>
18.0
</value>
</new>
<old>
<value>
27.5
</value>
</old>
</quantity>
18
27.5
有时,quantity对象显示如下:
<quantity>
<small>
14.25
</small>
</quantity>
14.25
在数量值与“新”和“旧”组合出现的情况下,我必须从中选择最小的值。因此,为了获取所有所需的数量值,我尝试使用以下XPath:
def sort=holder.getNodeValue(“//quantity/min(*/@value)|///quantity/small”)
这给了我错误消息“net.sf.saxon.trans.XPathException:“|”的第一个操作数的必需项类型为node();提供的值的项类型为xs:double”——当我在SoapUI中使用上述XPath时
有人能帮我解释一下为什么Union操作员在这里返回错误吗?我希望XPath能够获取XML文档中出现的数量值;当它出现在多个标记(例如:“new”和“old”)下时,我需要选择最小的值,当它出现在单个值(例如:“small”标记)下时,我需要按原样选择值
在此处添加包含所有可能数量值的代码示例:
<-- Auxillary nodes -->
<quantity>
<new>
<value>
18.0
</value>
</new>
<old>
<value>
27.5
</value>
</old>
</quantity>
<-- auxillary nodes -->
<quantity>
<small>
14.25
</small>
</quantity>
<-- auxillary nodes -->
<quantity>
<weighted>
<value>
18.0
</value>
</weighted>
<median>
<value>
27.5
</value>
</median>
<gross>
<value>
27.5
</value>
</gross>
</quantity>
<-- auxillary nodes -->
18
27.5
14.25
18
27.5
27.5
但是,如错误所示,第一个操作数返回一个double(本例中为18.0)
要获得所需内容,可以将XPath表达式更改为
"min(//quantity/*/value | //quantity/small)"
请注意,我删除了
@
,因为值是一个元素,而不是一个属性。感谢您的响应,但要求获取所有数量值,而不是最小的数量值。当一个对象中有两个量值时,只有在那个时候,我们才能找到最小的值。您建议的修改只为我返回一个值,这是所有数量值中最小的。是否有任何方法可以实现这一点?我在min()函数外指定第二个XPath的原因是,当它与“small”标记一起出现时,只有一个数量值(无需比较和选择最低值)因此,我需要在多个实例中出现时选择最低值:“def sort=holder.getNodeValues(“//quantity/min(*/@value)),或者在缺少标记值时从下面的XPath中进行选择(因为当XPath不存在时,我们会得到空值):“def sort=holder.getNodeValues(//quantity/small”)@Vishnuvardhan:当您只有一个
元素的值时,尝试我建议的XPath表达式会得到什么结果?min()
在只包含一个节点的节点集上运行良好。当我测试上述XPath时,根据我对您的需求的理解,它运行良好;尝试一下如果它给您一个错误的结果,请发布输入XML、您使用的表达式、确切的期望结果和实际结果。当我尝试d您建议的XPath。在我的XML中,最多可以有100个或更多类似的quantity对象。我必须选择所有的值,如果我们单独处理'small'标记,则可以使用“//quantity/small”。但值可能出现在两层(新的和旧的)在这种情况下,我要选择其中最小的一个。因此,当有两个范围时,我必须让XPath选择最小的,当处理单个值时,按原样选择值。因此,不可能使用min()这里?@Vishnuvardhan:好的,我到现在还不明白你可以有多个
元素。你提供的示例应该
作为根元素,其中只能有一个。请编辑你的问题,发布一个包含多个
元素的示例,包括
和
,所以我正试图解决与您相同的问题。为什么人们在没有留下评论的情况下否决了这个问题?
"min(//quantity/*/value | //quantity/small)"