计数嵌套的FLWOR循环在XQuery中运行的次数

时间:2019-12-14 19:25:50

标签: xquery marklogic

如果您的嵌套FLWOR语句带有两个'for'语句:

for $x at $xPos in (1, 2, 3)
 for $y at $yPos in fn:doc("/foo")//b
return ()

您如何准确计算for循环运行了多少次?假设'fn:doc(“ / foo”)// b'返回随机长度的序列,因此这是一个示例运行:

$xPos  $yPos
1       1
1       2
1       3
2       1
2       2
3       1 <-- for loop ends here (total times ran = 6)

另一个运行示例可能是:

$xPos  $yPos
1       1
1       2
2       1
2       2
2       3
3       1
3       2
3       3
3       4 <-- for loop ends here (total times ran = 9)

希望您能理解我的意思。如何在嵌套的for循环中保留和更新计数器变量,以计算我在该循环中运行了多少次而又没有在每次循环迭代时都将其重置?

说明编辑: 这个问题只是基于好奇心,以了解XQuery是否可行。我知道您可以像这样简单地放置一个let语句并跟踪$ xPos,这很简单:

for $x at $xPos in (1, 2, 3)
let $_ :=
 for $y at $yPos in fn:doc("/foo")//b
 return ()
return ()

3 个答案:

答案 0 :(得分:3)

在MarkLogic中,您可以使用xdmp:set突破严格的FLWOR范式。

let $count := 0
for $x at $xPos in (1, 2, 3)
for $y at $yPos in ("a", "b", "c")
let $set := xdmp:set($count, $count + 1)
return concat($count, ": ", $x, " ", $y)

产生:

1: 1 a
2: 1 b
3: 1 c
4: 2 a
5: 2 b
6: 2 c
7: 3 a
8: 3 b
9: 3 c

答案 1 :(得分:2)

XQuery 3具有count子句(https://www.w3.org/TR/xquery-31/#id-count):

for $x in (1 to 3)
for $y in //b
count $c
return ``[count `{$c}`: y: `{$y}`]``

https://xqueryfiddle.liberty-development.net/6qVRKvF作为输入

<doc>
    <b>a</b>
    <b>b</b>
    <b>c</b>
</doc>

返回结果

count 1: y: a
count 2: y: b
count 3: y: c
count 4: y: a
count 5: y: b
count 6: y: c
count 7: y: a
count 8: y: b
count 9: y: c

但是,如果我正确解释了https://docs.marklogic.com/guide/xquery/langoverview#id_11626,则Marklogic不支持count子句。

答案 2 :(得分:0)

以后再数:

for $x at $xPos in (1, 2, 3)
let $c :=
 for $y at $yPos in fn:doc("/foo")//b
 return 1
return count($c)

HTH!