XQuery:查找最接近给定数字的值

时间:2018-11-17 09:34:06

标签: xml xquery

我正在尝试使比率接近1,但似乎无法找到如何执行此操作……这是到目前为止的代码:

<testadvarden> 
   {for $i in 0 to 72
   let $latitude := $i
   let $iterad := (local:distance(data($latitude)))
   return <lista latitud = "{$latitude}" ratio = "{$iterad}" /> }
</testadvarden>

我的函数距离仅返回比率。这些是最相关的返回值:

<testadvarden>
  <lista latitud="26" ratio="1.210681245514598"/>
  <lista latitud="27" ratio="1.1472684079724134"/>
  <lista latitud="28" ratio="1.108013683878131"/>
  <lista latitud="29" ratio="1.0367234044480529"/>
  <lista latitud="30" ratio="0.9820439101177922"/>
  <lista latitud="31" ratio="0.8714211421572755"/>
  <lista latitud="32" ratio="0.7316921947582108"/>
</testadvarden>

所以我的问题是如何获得最接近1的比例的给定纬度。

1 个答案:

答案 0 :(得分:2)

abs(1 - @ratio)上的排序是否会给出最接近的排序?

您可以使用例如

进一步处理lista元素
for $l in */lista
order by abs(1 - $l/@ratio) ascending
count $pos
where $pos = 1
return data($l/@latitud)

https://xqueryfiddle.liberty-development.net/b4GWVa处返回30。除了使用count/where来标识已排序序列中的第一/最后一项外,您还可以使用head

head(
  for $l in */lista
  order by abs(1 - $l/@ratio) ascending
  return $l
)/@latitud/data()

除了使用order by进行排序外,在具有较高阶/内联函数的XQuery 3.1中,您还可以将sort函数与例如

一起使用
data(head(sort(lista, (), function($l) { abs(1 - $l/@ratio) }))/@latitud)

完整的样本应该是

declare context item := <testadvarden>
  <lista latitud="26" ratio="1.210681245514598"/>
  <lista latitud="27" ratio="1.1472684079724134"/>
  <lista latitud="28" ratio="1.108013683878131"/>
  <lista latitud="29" ratio="1.0367234044480529"/>
  <lista latitud="30" ratio="0.9820439101177922"/>
  <lista latitud="31" ratio="0.8714211421572755"/>
  <lista latitud="32" ratio="0.7316921947582108"/>
</testadvarden>;

data(head(sort(lista, (), function($l) { abs(1 - $l/@ratio) }))/@latitud)