Получение функциональности оператора MINUS SQL в XQuery - PullRequest
0 голосов
/ 20 июня 2011

Из предыдущих запросов у меня есть две переменные. Первый:

<list>
    <item>a</item>
    <item>b</item>
    <item>a</item>
    <item>c</item>
</list>

Второй:

<list>
    <item>b</item>
</list>

Я хочу, чтобы узлы были в первом списке, а не во втором:

<list>
    <item>a</item>
    <item>c</item>
</list>

(как оператор SQL MINUS) Как я могу это сделать?

РЕДАКТИРОВАТЬ : К счастью, WikiBooks уже имеет ответ .

1 Ответ

0 голосов
/ 12 января 2012

Попробуйте следующее, основанное на фундаментальных принципах XPath2.0 - оператор = действует как своего рода соединение и допускает неявную итерацию (в данном случае в сочетании с! Для не).

Обратите внимание, что переменная $ onlyin1 может использоваться непосредственно для вывода узлов из одного списка, которого нет во втором списке, но приведенный ниже код позволяет также дублировать узлы, которые имеют идентичное содержимое. *

let 
$list1 := 
<list>
    <item>a</item>
    <item>b</item>
    <item>a</item>
    <item>c</item>
</list>,
$list2 := 
<list>
    <item>b</item>
</list>,
$onlyin1 := $list1//item[text()!=$list2//item/text()]
return 
<list>
   {for $item in distinct-values($onlyin1/text()) return 
   <item>{$item}</item>
   }
</list>
...