xquery-如何在数值列表中的连续值之间获得差异

时间:2012-10-16 18:53:03

标签: xpath xquery flwor xpath-3.0 xquery-3.0

我在一个变量中成功提取了一个值,在另一个变量中提取了一个值列表(作为我的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 个答案:

答案 0 :(得分:2)

<强>予。使用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查询的执行速度几乎是XQuery 1.0的两倍 - 在BaseX上运行时。

答案 1 :(得分: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]

如果你想要这个职位,请记得使用'at $ 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]

似乎不容易,但它更酷)