如何在XQuery中获得计算值的最大值?

时间:2015-12-17 13:38:53

标签: xml max xquery

我有很多订单如下:

<order id="1">
   <TargetPrice>100</TargetPrice>
   <Qty>2</Qty>
</order>

我需要一个Xquery来获取具有最高值的订单(其中value是TargetPrice * Qty)

我该怎么做?

3 个答案:

答案 0 :(得分:3)

按降序对订单排序,并返回第一个元素。

(
  for $order in //order
  let $value := $order/TargetPrice * $order/Qty
  order by $value descending
  return $order
)[1]

答案 1 :(得分:2)

您可能希望在函数和运算符3.1规范的D.6.1中实现该函数。这有点比#34;排序更长,并采取第一个&#34;解决方案,但它可能更快(原则上它是可流动的),并且代码是高度可重用的。

D.6.1例如:最高

函数eg:highest返回具有所提供函数的最高值的项目。

XSLT实施

(剪断)

XQuery实现

declare function eg:highest(
                     $seq as item()*
                     $f as function(item()) as xs:anyAtomicType)
                  as item()* {
     fn:fold-left(
       fn:tail($seq), fn:head($seq),
       function($highestSoFar as item()*, $this as item()*) as item()* {
         let $thisValue := $f($this)
         let $highestValue := $f($highestSoFar[1])
         return
           if ($thisValue gt $highestValue)
             then $this
           else if ($thisValue eq $highestValue)
             then ($highestSoFar, $this)
           else $highestSoFar
       })
};

要查找薪水最高的员工,可以将该职能称为:

eg:highest(//employee, function($emp){$emp/salary})

答案 2 :(得分:1)

另一种选择是使用simple map operator !并为项目序列计算TargetPrice * Qty的乘积,然后选择max()值,并在谓词中使用:

let $maxVal := max(//order ! (TargetPrice * Qty))
return //order[(TargetPrice * Qty) eq $maxVal]