Xquery: найти значение, ближайшее к данному числу - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь получить соотношение, близкое к 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 голосов
/ 17 ноября 2018

Будет ли сортировка по 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 -развитии.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)
...