1

反復回数を変数で保持しようとしていますが、ご存知のように、xQuery変数は不変です

次のような特別な構文があります

for $film at $i in doc('films.xml')/films/film
return <film>{$i}.{data($film/@title)}</film>

私の問題は、ループが別のループ内にあるときに絶対反復の値をどのように保持するかです。

for $film at $i in doc('films.xml')/films/film
for $goofs at $j in $film/goofs/goof
return **total_absolute_number_goof** 

私は必要ないという意味です

i=1 j=1,2,3            i=1 j=1,2,3
i=2 j=1,2,3...  but    i=2 j=4,5,6

xqueryでそれを達成する簡単な方法はありますか?

編集:Javaと同等

int j = 0;
for (;some_external_condition;) 
   for (;some_external_condition;j++) {}
//j would print number of total iterations
4

2 に答える 2

3

これを行うためのXQuery3.0の機能があります。

for $film at $i in doc('films.xml')/films/film
for $goofs at $j in $film/goofs/goof
count $k
return $k

これは、Saxon-EE9.4などの一部のXQueryプロセッサにすでに追加されています。

XQuery 1.0では、2つのパスが必要になると思います。最初にフィルムのリストを作成し、次にそれらに番号を付けます。

于 2012-06-21T11:53:04.457 に答える
0

わかりました。XQuery3.0のカウント関数を使用できなかったため、次のようにする必要がありました。

    declare variable $array := ('a','b','c');
    declare variable $array2 := ('*','>',')');

    for $a at $c in $array
    for $b at $d in $array
    let $absIter := (($c - 1) * count($array)) + $d
    return $absIter

プリント:

    1 2 3 4 5 6 7 8 9

しかし、それは指数関数的に複雑になります...

    declare variable $array := ('a','b','c');
    declare variable $array2 := ('*','>');
    declare variable $array3 := ('*','>',')','ä');

    for $a at $d in $array
    for $b at $e in $array2
    for $c at $f in $array3
    let $absIter := (($d - 1) * count($array3) * count($array2)) + (($e - 1) * count($array3)) + $f
    return $absIter

プリント:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

問題は、サブループの反復回数が常に同じではない場合(つまり、親ループの変数からの動的副選択)-> XQueryネストループの自動インクリメンタル補助インデックス変数(動的カウント付き)

于 2012-07-03T10:47:05.910 に答える