2012-12-04 19 views
1

我知道应该有一个简单的解决方案,但我似乎无法弄清楚。假设我有一个查询返回这样的: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") 

如何获得OCCURENCES的数量在第二个表中的每个字母?

回答

2

我提出了两个变种,一个包含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:) 

这更像问题两个序列,考虑到这非常序列只包含不同的值。

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