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

二、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

性能比较

令人惊讶的是,当在 BaseX 上运行时,XPath (XQuery) 3.0 查询的执行速度几乎是 XQuery 1.0 的两倍。

于 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]

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