我需要从关系数据库中提取数据作为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>
......我没有得到我预期的结果:
<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>
这是(希望的)结果:
<myRecords>
<territory rec_count="1">Westboro</territory>
<territory rec_count="2">Bedford</territory>
<territory rec_count="3">Georgetow</territory>
…
答案 0 :(得分:1)
为Dimitre的答案添加一些内容,以下是如何做你正在尝试做的事情:
<myRecords> {
for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
return
<territory rec_count="{$i}">
{$Territories/TerritoryDescription/text()}
</territory>
} </myRecords>
正如Dimitre所指出的那样,for for内部的let不会保留每次迭代的值。 for的at子句将满足您的需要。
答案 1 :(得分:0)
let $i := 0 for $Territories in collection("Northwind.dbo.Territories")/Territories let $i := $i + 1 return
在内部let
中创建名为i
的新变量。
它被定义为具有外部 $i
的值加一:0 + 1
,其为1
。