我有一系列的价值观。他们都可以平等......或不。因此,使用XQuery,我想获得序列中最频繁的项目。
let $counter := 0, $index1 := 0
for $value in $sequence
if (count(index-of($value, $sequence)))
then
{
$counter := count(index-of($value, $sequence)) $index1 := index-of($value)
} else {}
我无法做到这一点,所以我想我做错了什么。
提前感谢你能给我的任何帮助。
答案 0 :(得分:6)
使用强>:
for $maxFreq in
max(for $val in distinct-values($sequence)
return count(index-of($sequence, $val))
)
return
distinct-values($sequence)[count(index-of($sequence, .)) eq $maxFreq]
更新,2015年12月:
这显然更短,但可能效率不高:
$pSeq[index-of($pSeq,.)[max(for $item in $pSeq return count(index-of($pSeq,$item)))]]
可以为XPath 3.1构建最短的表达式:
甚至更短且可复制 - 使用单字符名称:
$s[index-of($s,.)[max($s ! count(index-of($s, .)))]]
答案 1 :(得分:1)
你正在从太多的必要立场来解决这个问题。
在XQuery中,您可以设置变量的值,但永远不能更改它们。
执行迭代类型算法的正确方法是使用递归函数:
declare funciton local:most($sequence, $index, $value, $count)
{
let $current=$sequence[$index]
return
if (empty($current))
then $value
else
let $current-count = count(index-of($current, $sequence))
return
if ($current-count > $count)
then local:most($sequence, $index+1, $current, $current-count)
else local:most($sequence, $index+1, $value, $count)
}
但是解决问题的更好方法是以非迭代的方式描述问题。在这种情况下,序列中的所有不同值都需要显示任何不同值的最大次数。
以前的翻译成XQuery的传票是
let $max-count := max(for $value1 in distinct-values($sequence)
return count(index-of($sequence, $value1)))
for $value2 in distinct-values($sequence)
where (count(index-of($sequence, $value2)) = $max-count
return $value2