Я очень новичок в xQuery и могу решить первые части моего задания, но не могу заставить его работать.
XML: http://etutor.dke.uni -linz.ac.at / etutor / XML? Id = 1
Назначение:
Найти всех покупателей (Kunden), которые не покупали товар из категории (Kategorie) "Аудио".
Мой подход:
Получите все продукты категории «Аудио» в одной последовательности, затем извлеките все счета-фактуры (rechnung), которые содержат как минимум одну позицию счета-фактуры (rposition) с продуктом Audio. Из этой последовательности счетов я могу затем извлечь отдельные номера клиентов и вернуть все номера клиентов полной последовательности клиентов ($ kunden), которые не перечислены (те, которые не покупали аудиопродукт).
Моя главная проблема в том, что я не могу заставить его работать над созданием последовательности, которая содержит полные узлы счета-фактуры (rechnung), которые содержат продукт из последовательности $ prodaudio.
Не было проблем извлечь все позиции с продуктом типа $ prodaudio (см. $ Audiorpositions).
Я был бы очень признателен за лучшие подходы или зашифрованные коды, которые помогают мне понять, как извлечь последовательность всех узлов счета-фактуры (rechnung), которые содержат хотя бы одну позицию с продуктом из sequence @ prodaudio.
Так как я уже выполнил некоторые упражнения, я совершенно уверен, что могу решить часть с номерами клиентов самостоятельно. На данный момент мне просто нужна помощь в получении последовательности вышеупомянутых счетов. Каждая попытка добиться этого дала мне последовательность всех или ни одного из счетов.
Результат должен содержать только номер клиента в качестве элемента.
let $doc := doc("https://etutor.dke.uni-linz.ac.at/etutor/XML?id=1")
let $prodaudio := $doc//produkt[kategorie = "Audio"]
let $kunden := $doc//kunde
for $rechnungen in $doc//rechnung
let $rpos := $doc//rechnung/rposition
let $audiorpositions := $doc//rechnung/rposition[$prodaudio/@ean = ean]
return $audiorpositions
xml выдержка:
<?xml version="1.0" encoding="UTF-8"?>
<handelskette>
<produkte>
<produkt ean="0-666-4567-2-22">
<bezeichnung>Autoschampoo</bezeichnung>
<kategorie>Pflege</kategorie>
<ekPreis>35</ekPreis>
<listPreis>69</listPreis>
</produkt>
...
</produkte>
...
<kunden>
<kunde kundeNr="11111">
<name>Roller</name>
<bonStufe>C</bonStufe>
</kunde>
<kunde kundeNr="15882">
<name>Schieber</name>
<bonStufe>B</bonStufe>
</kunde>
...
</kunden>
...
<rechnungen>
...
<rechnung rechnungNr="12" datum="03.10.00">
<bezahlt>Y</bezahlt>
<kundeNr>11111</kundeNr>
<filNr>6</filNr>
<rposition>
<ean>5-6661-000-0-00</ean>
<einzelPreis>530</einzelPreis>
<menge>3</menge>
</rposition>
<rposition>
<ean>7-2881-760-3-70</ean>
<einzelPreis>1300</einzelPreis>
<menge>1</menge>
</rposition>
<rposition>
<ean>0-4381-880-7-00</ean>
<einzelPreis>1350</einzelPreis>
<menge>1</menge>
</rposition>
</rechnung>
...
</rechnungen>
</handelskette>
edit: полное решение задачи:
declare context item := doc("https://etutor.dke.uni-linz.ac.at/etutor/XML?id=1");
let $kunden := //kunde,
$rechnungen := //rechnung,
$produkte := //produkt
for $r in $kunden[not(@kundeNr = $rechnungen[rposition/ean = $produkte[kategorie = 'Audio']/@ean]/kundeNr)]
return
<kundeNr>
{data($r/@kundeNr)}
</kundeNr>
возвращает этот вывод:
<kundeNr>15882</kundeNr>
<kundeNr>78436</kundeNr>
<kundeNr>98077</kundeNr>
<kundeNr>13451</kundeNr>
<kundeNr>99332</kundeNr>
<kundeNr>55789</kundeNr>
<kundeNr>77777</kundeNr>