2012-12-04 49 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