2012-10-16 84 views
1

我已經成功地提取了一個變量中的一個值和另一個變量(作爲我的XQuery表達式的一部分)中的值列表。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... 

,但沒有顯示在所有作爲輸出......什麼我錯在這裏做什麼?

回答

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上運行時比XQuery 1.0更快。

+0

如果我也想從結果列表中的最小/最大值,我該怎麼做? (在xquery 1/xquery 3中)?謝謝... – Arvind

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還具有窗口子句只是這種情況下:

可能會是這樣的:

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] 

似乎並不容易,但它是冷卻器)

相關問題