从一个元素中具有最高整数的文档返回xml

时间:2011-12-01 19:30:48

标签: xml xpath xquery

我有一个相当长的XML文档,其中包含名为<Pages>的元素下的子部分。这些页面中的每一个都包含一个名为<NumberOfEntries>的元素,其中包含整数值。

我试图显示具有最多条目数的<Page>中的XML部分。

我查看了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 个答案:

答案 0 :(得分:3)

由于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]

答案 1 :(得分:2)

这个怎么样?

let $max := max(//Page//NumberOfEntries)
for $x in //Page
where number($x//NumberOfEntries) eq $max
return $x

答案 2 :(得分:1)

即使使用单个XPath 2.0表达式

也可以这样做
for $m in max(//Page//NumberOfEntries/xs:integer(.))
  return (//Page[(.//NumberOfEntries)[1]/xs:integer(.) eq $m])[1]

这将选择XML文档中的第一个(按文档顺序)Page元素,该元素具有NumberOfEntries后代,其值是对任何此类NumberOfEntries后代观察到的最大值{ {1}}。

如果您想选择 所有 包含最多条目数的网页,只需将上述内容简化为

Page