我有一个相当长的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)
答案 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