XQuery:如何获取具有子节点的所有节点,该子节点的属性包含在序列中

时间:2019-05-06 10:50:31

标签: nodes xquery

我对xQuery还是很陌生,可以解决我的工作的第一部分,但无法正常进行。 XML:http://etutor.dke.uni-linz.ac.at/etutor/XML?id=1

任务: 找到所有未购买“音频”类别(类别)产品的客户(昆顿)。

我的方法: 依次获取“音频”类别的所有产品,然后提取至少包含一个音频产品发票位置(rposition)的所有发票(rechnung)。然后,我可以从此发票序列中提取不同的客户编号,并返回未列出(未购买音频产品的客户)完整客户序列($ kunden)中的所有客户编号。

我的主要问题是,我无法使它正常构建序列,该序列包含完整的发票节点(rechnung),其中包含序列$ prodaudio的产品。 可以使用$ prodaudio类型的产品提取所有职位(请参阅$ audiorpositions)。

我将不胜感激更好的方法或任何代码片段,它们可以帮助我理解如何提取所有发票节点(rechnung)的序列,其中至少包含一个位置,并带有@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>

编辑:完整作业解决方案:

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 :(得分:0)

假设我认为 scalars j; sets o /red,green,blue/ p /b1,b2,b3,p1,p2,p3/ k /1*3/; Table sup(*,*) b1 b2 b3 p1 p2 p3 red 12 15 20 200 50 50 green 16 17 0 150 50 0 blue 13 18 0 100 50 0 ; parameters Bid_Red(k),Pmax_Red(k),t; *for statement*************** for(j= 1 to 3, t=card(o)+j; Bid_Red(k)$( ord(k) = j )=sup('red',j); Pmax_Red(k)$( ord(k) = j )=sup('red',t); ); *loop statement*************** t=card(o); loop(k, Bid_Red(k)=sup('red',k); Pmax_Red(k)=sup('red',k+t); ); display Bid_red, Pmax_Red

declare context item := doc("https://etutor.dke.uni-linz.ac.at/etutor/XML?id=1");

返回那些客户编号未出现在链接到“音频”类别的产品的发票上的客户。

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