Как написать запрос flwor xquery?

У меня 5 машин, у каждой машины 5 владельцев, мне нужно вернуть тех владельцев, чья нация не значится в владельцах других машин (может появиться в владельцах той же машины):

<root>
  <car>
   <id>1</id>
   <owner>
            <name>George Smith</name>
            <nation>USA</nation>
   </owner>
   <owner>
            <name>Carolina Herre</name>
            <nation>USA</nation>
   </owner>
   <owner>
            <name>Martha Belar</name>
            <nation>Denmark</nation>
   </owner>
   <owner>
            <name>Fernando Izza</name>
            <nation>Italy</nation>
   </owner>
   <owner>
            <name>George Smith</name>
            <nation>Italy</nation>
   </owner>
 </car>
 <car>
   <id>2</id>
   <owner>
            <name>George Gelar</name>
            <nation>USA</nation>
   </owner>
   <owner>
            <name>Gema Bio</name>
             <nation>Spain</nation>
    </owner>
    <owner>
             <name>Peter Vdf</name>
            <nation>Denmark</nation>
    </owner>
    <owner>
            <name>Felipe Rodriguez</name>
            <nation>Denmark</nation>
    </owner>
    <owner>
            <name>George Smith</name>
            <nation>USA</nation>
    </owner>
</car>
<car>
...
</car>
<car>
...
</car>
<car>
...
</car>
</root>

То есть, учитывая этот xml, вывод будет:

<owner>
    <name>Fernando Izza</name>
    <nation>Italy</nation>
    <carID>1</carID>
</owner>
<owner>
    <name>George Smith</name>
    <nation>Italy</nation>
    <carID>1</carID>
</owner>
<owner>
    <name>Gema Bio</name>
    <nation>Spain</nation>
    <carID>2</carID>
</owner>

Я попытался получить список стран, которые не указаны в нескольких автомобилях, а затем получить тех владельцев, которые из этих стран, но я не знаю, как его получить.


person Leon    schedule 09.11.2017    source источник
comment
Что вы пробовали? Не могли бы вы показать нам свой XQuery?   -  person dirkk    schedule 09.11.2017
comment
Вот действительно хорошее правило задавать вопросы здесь. Не умоляй. Вообще. Всегда.   -  person halfer    schedule 09.11.2017
comment
Хорошо, извините! Я пробовал следующее, чтобы получить нации владельцев автомобилей, которые появляются только для одной машины. Но я не знаю, как мне продолжать, или поможет ли мне это начало: for $c в doc(cars.xml)//car for $n в different-values(doc(cars.xml)//car/owner /nation/text()) пусть $m := $c/owner/nation/text() возвращает if ($n=$m) then ‹nation›{$n}‹/nation› else ()   -  person Leon    schedule 09.11.2017


Ответы (1)


Вы можете просто сгруппировать владельцев по их нации, а затем посмотреть вверх, чтобы увидеть, встречается ли нация ниже более чем одной машины:

for $owner in doc("cars.xml")//car/owner
group by $nation := $owner/nation
where count($owner/..) eq 1
for $o in $owner
return <owner>{
  $o/*,
  <carID>{$o/../id/text()}</carID>
}</owner>
person Leo Wörteler    schedule 09.11.2017