XQuery比较2个数字列表

时间:2014-11-24 13:21:05

标签: xquery

给出2 xml文件,其中包含每个文件中的数字列表。

<list1>
    <item>1</item>
    <item>2</item>
    ...
</list1>

list1 = [1,2,3,4,5,7,8,9,10]
list2 = [1,4,6,2,8]

我只希望list1中的数字大于list2中的所有数字,我该怎么做?

我尝试了这个,但只有当它大于list2中的数字而不是整个列表时才会返回该数字。

for $x in doc("list1.xml")/item
    for $y in doc("list2.xml")/item
        where ($x > $y) 
return $x

先谢谢,xquery中的新手。

2 个答案:

答案 0 :(得分:2)

使用XQuery 3.0,你可以使用fn:for-each,这在我看来是更好的语法。因此,对于$list1中的每个项目,它会检查$list2中的项目是否更大。

let $list1 := (1 to 10)
let $list2 := (1, 4, 6, 2, 8)
return for-each($list1, function($l) {
  if (for-each($list2, function($x) {$l > $x}) = false())
  then ()
  else $l
})

如果您只有XQuery 1.0,这应该也可以,并且基本相同:

let $list1 := (1 to 10)
let $list2 := (1, 4, 6, 2, 8)
for $l in $list1
where not((
  for $f in $list2
  return $l > $f
) = false())
return $l

答案 1 :(得分:0)

也许我误解了这个问题,但在我看来,使用一个不需要任何显式循环的单个谓词有一个更简单,更有效的解决方案:

xquery version "1.0";

let $list1 := (1, 2, 3, 4, 5, 7, 8, 9, 10)
let $list2 := (1, 4, 6, 2, 8)

let $max2 := max($list2)

return

    $list1[. gt $max2]

我还要向@ ou-ye清楚地说明一下XQuery术语。目前在XQuery中没有List结构,最接近的是使用()构建的Sequence。