在XPath 2.0中使用min()或max()时的更多条件

时间:2015-10-05 13:13:22

标签: xml xpath soapui

为什么在尝试使用Union运算符以及XPath 2.0中的'min()'或'max()'函数时会出现错误?我正在处理的XML有一个名为'quantity'的对象,其形式如下:

<quantity>
  <new>
  <value>
  18.0
  </value>
  </new>

  <old>
  <value>
  27.5
  </value>
  </old>
</quantity>

有时,数量对象如下所示:

<quantity>
  <small>
  14.25
  </small>
</quantity>

如果数量值与“新”和“旧”组合一起出现,我必须选择其中的最小值。因此,为了获取所有所需的数量值,我尝试使用以下XPath:

def sort = holder.getNodeValues(“//数量/分钟(* / @值)| //数量/小”)

这给了我错误消息“ 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 -->

1 个答案:

答案 0 :(得分:0)

parameters说,

Both expressions [the operands] must return sequences of nodes.

但是,如错误所示,您的第一个操作数将返回一个double(在这种情况下为18.0)。

要获得您正在寻找的内容,您可以将XPath表达式更改为

"min(//quantity/*/value | //quantity/small)"

请注意,我删除了@,因为value是一个元素,而不是一个属性。