1

これには簡単な解決策があるはずですが、理解できないようです。次のようなクエリを返すとします。

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番目の表の各文字の出現回数を取得するにはどうすればよいですか?

4

2 に答える 2

2

使用:

for $s in $vMySeq
       return
          ($s, count(index-of($vSeq, $s)))

ここ$vMySeqで、 は最初のクエリ$vSeqの結果であり、 は 2 番目のクエリの結果です。

完全な例:

   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
于 2012-12-04T14:02:08.593 に答える
2

2 つのバリアントを提案します。1 つは group by 句を含み、グループ化されていない変数 $cntr に必要な特性をたまたま示しています ( http://www.w3.org/TR/xquery-30/#id-group-を参照)。グループ化の実行方法の詳細について):

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>

私の2番目の、おそらくより明白なバリアントは次のとおりです。

let $seq := ("B", "B","B","A","C","A")
for $v in distinct-values($seq)
    return <el>{
      attribute num {count($seq[. = $v])},
      $v
    }</el>

私の答えは少し不正確だったので、ディミトレ・ノヴァチェフの答えに触発されたマイナーな修正がここにあります。

使用する代わりに:

for $v in distinct-values($seq)

あなたも使うかもしれません

for $v in ("A", "B", "C") (: this is sequence 1 as stated in the question:)

これは、質問の 2 つのシーケンスによりよく似ています。このシーケンスには個別の値のみが含まれているためです。

于 2012-12-04T08:59:37.420 に答える