1

我试图在 vars 中保存迭代次数,但如您所知,xQuery vars 是不可变的

有一个特殊的语法,比如

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

XQuery 3.0 中有一个特性可以做到这一点:

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

它已经被添加到一些 XQuery 处理器中,例如 Saxon-EE 9.4。

在 XQuery 1.0 中,我认为您需要两遍:首先创建电影列表,然后为它们编号。

于 2012-06-21T11:53:04.457 回答
0

好的,我不能使用 XQuery 3.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

问题是当子循环中的迭代次数并不总是相同时(即,从父循环中的 var 动态子选择)-> XQuery 嵌套循环的自动增量辅助索引 var(w.动态计数)

于 2012-07-03T10:47:05.910 回答