Xquery 有没有办法对提取的记录进行编号。

Xquery 有没有办法对提取的记录进行编号。,xquery,Xquery,我需要从关系数据库中提取XML格式的数据,并且需要为提取的每条记录分配一个数字。我编写了以下XQuery <myRecords> { let $i := 0 for $Territories in collection("Northwind.dbo.Territories")/Territories let $i := $i + 1 return <territory rec_count="{$i}">

我需要从关系数据库中提取XML格式的数据,并且需要为提取的每条记录分配一个数字。我编写了以下XQuery

<myRecords> {
    let $i := 0
    for $Territories in collection("Northwind.dbo.Territories")/Territories
    let $i := $i + 1
    return
        <territory rec_count="{$i}">
            {$Territories/TerritoryDescription/text()}
        </territory>
} </myRecords>
{
设$i:=0
对于$Territions in collection(“Northwind.dbo.Territions”)/Territions
设$i:=$i+1
返回
{$Territions/TerritoryDescription/text()}
} 
。。。我没有得到我期望的结果:

<myRecords>
    <territory rec_count="1">Westboro</territory>
    <territory rec_count="1">Bedford</territory>
    <territory rec_count="1">Georgetown</territory>
…

韦斯特博罗
贝德福德
乔治城
…
记录编号不会增加。为什么?

XQuery是一种没有副作用的函数式语言——您不能像在Java或C#中那样在XQuery中真正创建状态概念。在某些情况下,可以使用递归函数模拟状态,但要解决此问题,有一个更简单的解决方案:可以使用位置变量。以下是XQuery:

<myRecords> {
    for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
    return
        <territory rec_count="{$i}">
            {$Territories/TerritoryDescription/text()}
        </territory>
} </myRecords>
{
对于$i收款的$Territions(“Northwind.dbo.Territions”)/Territions
返回
{$Territions/TerritoryDescription/text()}
} 
下面是(希望的)结果:


韦斯特博罗
贝德福德
乔治敦
…
在内部
中,创建一个名为
i
的新变量

它被定义为将外部
$i
的值加上一:即
0+1
,这将给出
1

在内部
中,创建一个名为
i
的新变量


它被定义为将外部
$i
的值加上一:即
0+1
,这将为
1

添加一点到Dimitre的答案中,下面是如何执行您尝试执行的操作:

<myRecords> {
  for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
  return
    <territory rec_count="{$i}">
      {$Territories/TerritoryDescription/text()}
    </territory>
} </myRecords>
{
对于$i收款的$Territions(“Northwind.dbo.Territions”)/Territions
返回
{$Territions/TerritoryDescription/text()}
} 

正如Dimitre所指出的,for中的let不会在每次迭代中保留值。for的at子句将满足您的需要

为Dimitre的答案添加一点内容,下面是如何做您正试图做的事情:

<myRecords> {
  for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
  return
    <territory rec_count="{$i}">
      {$Territories/TerritoryDescription/text()}
    </territory>
} </myRecords>
{
对于$i收款的$Territions(“Northwind.dbo.Territions”)/Territions
返回
{$Territions/TerritoryDescription/text()}
} 
正如Dimitre所指出的,for中的let不会在每次迭代中保留值。for的at子句将满足您的需要

<myRecords> {
  for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
  return
    <territory rec_count="{$i}">
      {$Territories/TerritoryDescription/text()}
    </territory>
} </myRecords>