1

リレーショナルデータベースから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>
…
4

2 に答える 2

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内のletは、反復ごとに値を保持しません。forのat句は、必要なことを実行します。

于 2012-07-08T01:06:28.527 に答える
0
let $i := 0
     for $Territories in collection("Northwind.dbo.Territories")/Territories
     let $i := $i + 1
     return

内部には、という名前let新しい変数iが作成されます。

これは、外側 に1を加えた値を持つように定義されています。$iつまり0 + 1、を与え1ます。

于 2012-07-07T16:06:41.903 に答える