2012-10-16 48 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] 

似乎并不容易,但它是冷却器)

相关问题