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

More conditions while using the min() or max() in XPath 2.0

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

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

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

有时,数量对象是这样的:

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

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

def sort = holder.getNodeValues( "//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 -->

documentation for the union operator (in Saxon) 说,

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

但是,如错误所示,您的第一个操作数 returns 是双精度数(本例中为 18.0)。

要获得所需内容,您可以将 XPath 表达式更改为

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

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