我在一个变量中成功提取了一个值,在另一个变量中提取了一个值列表(作为我的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...
但根本没有显示输出......我在这里做错了什么?
答案 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]
似乎不容易,但它更酷)