вернуть XML из документа с самым высоким целым числом в одном элементе - PullRequest
1 голос
/ 01 декабря 2011

У меня довольно длинный XML-документ с подразделами под элементами <Pages>.Каждая из этих страниц содержит элемент с именем <NumberOfEntries> с целочисленным значением.

Я пытаюсь показать часть XML из <Page>, которая имеет наибольшее количество записей.

Я смотрел на функцию fn:max, но она не работает для меня ...

Это то, что я пробовал -

for $x in /Document
where $x fn:max(//NumberOfEntries)
return $x//Page::node()

РЕДАКТИРОВАТЬ

Я только что поработал над этим, но он возвращает все страницы - не только страницу с наибольшим количеством записей - какие-нибудь предложения?

for $x in /Document
where max($x//NumberOfEntries)
return ($x//Page)

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011

Поскольку max(...) не возвращает логические результаты, where max($x//NumberOfEntries) эквивалентно where exists(max($x//NumberOfEntries)), поэтому ничего не фильтруется. Вы хотите найти страницу с максимальным количеством записей, вот что я бы сделал:

let $pages := /Document//Page,
    $max   := max($pages//NumberOfEntries)
return $pages[.//NumberOfEntries = $max]

Если несколько страниц имеют одинаковое количество записей, и это максимум, все они возвращаются. Если вам нужен только один результат, вы можете заключить последнюю строку в (...)[1], чтобы взять первую:

let $pages := /Document//Page,
    $max   := max($pages//NumberOfEntries)
return ($pages[.//NumberOfEntries = $max])[1]
2 голосов
/ 02 декабря 2011

Как насчет этого?

let $max := max(//Page//NumberOfEntries)
for $x in //Page
where number($x//NumberOfEntries) eq $max
return $x
1 голос
/ 03 декабря 2011

Это может быть сделано даже с одним выражением XPath 2.0 :

for $m in max(//Page//NumberOfEntries/xs:integer(.))
  return (//Page[(.//NumberOfEntries)[1]/xs:integer(.) eq $m])[1]

Это выбирает первый (в порядке документа) элемент Page в документе XML, который имеетNumberOfEntries потомок, значение которого является максимумом, наблюдаемым для любого такого NumberOfEntries потомка любого Page.

Если вы хотите выбрать all страницы с максимальным количеством записей, просто упростите приведенное выше до :

for $m in max(//Page//NumberOfEntries/xs:integer(.))
      return //Page[(.//NumberOfEntries)[1]/xs:integer(.) eq $m]
...