我如何在xquery中拥有反击?

时间:2014-04-22 04:28:48

标签: xml xquery exist-db

我在exists-db中使用XQuery,我想使用计数器。例如,我有这段代码:

xquery version "3.0";
for $P in 1 to 351
  let $S := data(doc(concat('/db/INDEX/' , $P , '.html'))//h1)
    for $result in $S
     return <a class="libraryIndexlink" href="http://library.net/newindex.aspx?pid=102834&amp;BookID=106201&amp;PageIndex={$P}&amp;Language=1#p0">{$result}</a>

我需要在Language=1#p之后计数器变量。例如:

Language=1#p0">

Language=1#p1">

Language=1#p2">

我写下这些代码:

declare function local:prod2ndDigit() {
    for $x in (0 to 10)
        return <counter>{$x}</counter>
};
local:prod2ndDigit()

此代码有效,但存在逻辑错误。 我的其他代码是:

declare function local:prod2ndDigit() {
  declare variable $C := 0
  return $C := $C + 1
};
local:prod2ndDigit()

此代码不起作用。

最终代码是:

declare function local:prod2ndDigit() {
    for $x in (0 to 10)
        return <counter>{$x}</counter>
};

for $P in 1 to 351
  let $S := data(doc(concat('/db/INDEX/' , $P , '.html'))//h1)
    for $result in $S
     return <a class="libraryIndexlink" href="http://library.net/newindex.aspx?pid=102834&amp;BookID=106201&amp;PageIndex={$P}&amp;Language=1#plocal:prod2ndDigit()">{$result}</a>

但是这段代码似乎有一个逻辑错误。 我编写此代码但它返回false而不是整数:

let $C := 0
    return
        $C = $C + 1

2 个答案:

答案 0 :(得分:3)

您使用的逻辑不适用于像XQuery这样的函数式编程语言。我想你想迭代每个h1元素,并希望包含一个增加的计数器。这实际上比你想象的更简单:

for $result at $key in data(doc(concat('/db/INDEX/' , $P , '.html'))//h1)
return <a class="libraryIndexlink" href="http://library.net/newindex.aspx?pid=102834&amp;BookID=106201&amp;PageIndex={$P}&amp;Language=1#p{$key - 1}">{$result}</a>

at $key语句为您提供位置,即您想要的计数器。因为看起来你想从0开始,但是在XQuery序列中始终从位置1开始,因此我们使用- 1

您的代码中还有其他一些问题。您必须将XQuery函数调用或变量放入花括号中,您为$P执行的操作,但local:prod2ndDigit()没有。

代码let $C := 0 return $C = $C + 1返回false是正确的。您使用的是=运算符,它在XQuery中的含义相同。您可能打算编写一个赋值,其运算符为:=。此外,似乎你想增加柜台。请记住,XQuery是一种函数式语言,正如我之前所说,所以你可以永远不会操作变量你总是会创建一个新的$counter变量并遮蔽旧值,但你可以不像在C,Java,Python等其他语言中那样更改变量,等等。

我不知道你希望用你的函数local:prod2ndDigit()实现什么。它返回一系列项目,但我在这里看不到用例。

答案 1 :(得分:0)

谢谢dirkk。我操纵你的答案并得到正确的答案: 非常非常感谢....

xquery version "3.0";
for $P in 1 to 351
for $result at $key in data(doc(concat('/db/INDEX/' , $P , '.html'))//h1)
return <a class="libraryIndexlink" href="http://library.net/newindex.aspx?pid=102834&amp;BookID=106201&amp;PageIndex={$P}&amp;Language=1#p{$key - 2+$P}">{$result}</a>