1

次のエントリを含む XML ファイルがあります。

<file>
 <unit id="u-1.01"/>
 <unit id="u-1.02"/>
 <unit id="u-1.03"/>
 <unit id="u-1.04"/>
 <unit id="u-1.05"/>
 <unit id="u-1.06"/>
 <unit id="u-1.07"/>
 <unit id="u-2.01"/>
 <unit id="u-2.02"/>
 <unit id="u-2.03"/>
 <unit id="u-2.04"/>
 <unit id="u-2.05"/>
 <unit id="u-2.06"/>
</file>

以下のクエリを使用して、個別値の数を数えたいと思います。

クエリは、各@id属性を調べて、文字列の 3 番目の文字を選択します。

declare function local:count-base-pages($basefile) {
for $identifiers in $basefile/unit/@id
let $id := distinct-values(substring($identifiers, 3, 1)) 
return count($id) 
};

ただし、このクエリは次のシーケンスを返します。

1 1 1 1 1 1 1 2 2 2 2 2 2

21 と 2 という 2 つの異なる値があるため、望ましい結果が得られます。

個別の値カウント関数をどのように誤用していますか?

4

2 に答える 2

2

関数を実際の FLWOR 式にラップする必要があります。count(distinct-values(for ... return ...))

于 2012-09-13T12:56:34.107 に答える
1

短い方を使用:

count(distinct-values(/*/*/@id/substring(.,3,1)))

提供された XML ドキュメントに対して上記の XQuery を実行します

<file>
 <unit id="u-1.01"/>
 <unit id="u-1.02"/>
 <unit id="u-1.03"/>
 <unit id="u-1.04"/>
 <unit id="u-1.05"/>
 <unit id="u-1.06"/>
 <unit id="u-1.07"/>
 <unit id="u-2.01"/>
 <unit id="u-2.02"/>
 <unit id="u-2.03"/>
 <unit id="u-2.04"/>
 <unit id="u-2.05"/>
 <unit id="u-2.06"/>
</file>

必要な正しい結果が生成されます

2
于 2012-09-13T14:16:16.943 に答える