2014-11-24 130 views
1

給定2個包含每個編號列表的xml文件。XQuery比較2個編號列表

<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

使用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 
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] 

我也想講清楚@歐燁一些關於XQuery的術語。目前在XQuery中沒有像List結構那樣的東西,最接近的是使用()構建的序列。