我已经成功地在一个变量中提取了一个值,并在另一个变量中提取了一列值(作为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...
但是没有任何东西显示为输出...我在这里做错了什么?
发布于 2012-10-17 04:36:05
I.使用XQuery 3.0 /XPath3.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
性能比较
令人惊讶的是,当在BaseX上运行时,XPath ( XQuery ) 3.0查询的执行速度几乎是XQuery 1.0查询的两倍。
发布于 2012-10-17 04:35:16
你的例子太抽象了,真的不清楚你想用什么。
但您可以像这样减去$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]
看起来并不容易,但它更酷)
https://stackoverflow.com/questions/12921541
复制相似问题