1

1つの変数の1つの値と、別の変数の値のリスト(XQuery式の一部として)を正常に抽出しました。

ここで、単一値変数が

x=1

リスト変数の名前はyで、値は2、4、7、11、16です。

次の値を抽出したい-(2-1)、(4-2)、(7-4)、(11-7)、(16-11)

つまり、リスト変数の最初の値から単一値変数を引いた後、リスト変数の連続するメンバー間の差です。

使ってみました

for $pos in list-variable/position() 
-> if clause for $pos=1 (to subtract and shown list variable- single value variable)    
->else show difference b/w consecutive list variables... 

しかし、出力として何も表示されません...ここで何が間違っているのですか?

4

2 に答える 2

2

I. XQuery 3.0 / Xpath 3.0では、以下を使用します

let $pVal := 1,
    $vList := (2,4,7,11,16),
    $vList2 := ($pVal, subsequence($vList, 1, count($vList)-1))
 return
    map-pairs(function($m as xs:integer, $n as xs:integer) as xs:integer
                {
                 $m - $n
                },
                $vList,
                $vList2
              )

これにより、必要な正しい結果が得られます。

1 2 3 4 5

II。XQuery 1.0ソリューション

let $pVal := 1,
    $vList := (2,4,7,11,16),
    $vList2 := ($pVal, subsequence($vList, 1, count($vList)-1))
 return
    for $i in 1 to count($vList)
     return
        $vList[$i] - $vList2[$i]

再び同じ正しい結果を生成します

1 2 3 4 5

パフォーマンスの比較

驚いたことに、XPath(XQuery)3.0クエリは、BaseXで実行した場合、XQuery1.0クエリのほぼ2倍の速度で実行されます。

于 2012-10-16T20:36:04.903 に答える
1

あなたの例はとても抽象的なので、あなたが何を使おうとしたのかは本当にはっきりしていません。

ただし、次のように$xまたは前の要素を減算できます。

 let $x := 1, $seq := (2,4,7,11,16)  
 for $temp at $pos in $seq 
 return $seq[$pos] - if ($pos eq 1) then $x else $seq[$pos - 1]

位置が必要な場合は、「$pos」を使用することを忘れないでください。

(ところで、XQuery 3には、この場合のためだけにwindow句もあります。

おそらく次のようになります:

 let $x := 1, $seq := (2,4,7,11,16) 
 for sliding window $w in ($x, $seq)
     start at $s when fn:true()
     only end at $e when $e - $s eq 1
 return $w[2] - $w[1]

簡単ではないようですが、涼しいです)

于 2012-10-16T20:35:16.127 に答える