XQuery: как получить все узлы, имеющие дочерний узел с атрибутом, который содержится в последовательности - PullRequest
0 голосов
/ 06 мая 2019

Я очень новичок в 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>

1 Ответ

0 голосов
/ 06 мая 2019

Предполагая declare context item := doc("https://etutor.dke.uni-linz.ac.at/etutor/XML?id=1"); Я думаю

let $kunden := //kunde,
    $rechnungen := //rechnung,
    $produkte := //produkt
return
    $kunden[not(@kundeNr = $rechnungen[rposition/ean = $produkte[kategorie = 'Audio']/@ean]/kundeNr)]

возвращает тех клиентов, чей номер клиента не указан в счете, связанном с продуктом категории «Аудио».

https://xqueryfiddle.liberty -development.net / 6qM2e2k / 1

...