2014-11-24 2 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] 

Я только хочу, чтобы число в списке1 больше, чем все число в списке2, как я могу это сделать?

Я пробовал это, но он возвращает только число, если оно больше, чем одно из числа в списке2, а не весь список.

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, ближайшая вещь - это последовательность, которая строится с использованием ( и ).

Смежные вопросы