XQUERY:查找另一个查询中出现的次数

时间:2012-12-04 04:51:47

标签: xpath xquery

我知道应该有一个简单的解决方案,但我似乎无法弄明白。假设我有一个返回类似的查询:

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")

如何获取第二张表中每个字母的出现次数?

2 个答案:

答案 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