我知道应该有一个简单的解决方案,但我似乎无法弄明白。假设我有一个返回类似的查询:
xs:untypedAtomic("A"),
xs:untypedAtomic("B"),
xs:untypedAtomic("C")
我还有一个返回类似的东西:
xs:untypedAtomic("B"),
xs:untypedAtomic("B"),
xs:untypedAtomic("B"),
xs:untypedAtomic("A"),
xs:untypedAtomic("C"),
xs:untypedAtomic("A")
如何获取第二张表中每个字母的出现次数?
答案 0 :(得分:2)
我提出了两个变体,一个包含group by子句,恰好显示了非分组变量$ cntr的所需特征(有关如何执行分组的详细信息,请参阅http://www.w3.org/TR/xquery-30/#id-group-by):
let $seq := ("B", "B","B","A","C","A")
let $cntr := 1
for $it in $seq
group by $it
return <el>{
attribute num {count($cntr)},
$it
}</el>
我的第二个,也许更明显的变体是:
let $seq := ("B", "B","B","A","C","A")
for $v in distinct-values($seq)
return <el>{
attribute num {count($seq[. = $v])},
$v
}</el>
由于我的答案有点不精确,这里有一个小小的修正,受到Dimitre Novatchev答案的启发。
而不是使用:
for $v in distinct-values($seq)
你也可以使用
for $v in ("A", "B", "C") (: this is sequence 1 as stated in the question:)
更接近于两个序列的问题,因为这个序列只包含不同的值。
答案 1 :(得分:2)
使用强>:
for $s in $vMySeq
return
($s, count(index-of($vSeq, $s)))
其中$vMySeq
是第一个查询的结果,$vSeq
是第二个查询的结果。
完整示例:
let $vMySeq := ('A', 'B', 'C'),
$vSeq := ('B', 'B', 'B', 'A', 'C', 'A')
return
for $s in $vMySeq
return
($s, count(index-of($vSeq, $s)))
结果是:
A 2 B 3 C 1