Вывод группы xQuery по категориям - PullRequest
0 голосов
/ 13 мая 2019

У меня есть еще одна маленькая проблема с xQuery / xPath. Для моей домашней работы мне нужно вывести ассортимент продукции по отраслям и категориям продуктов, где выходные данные должны содержать только те ветви (filiale), которые имеют продукты (produkt и prodInSortiment) каждой категории (категории). Данные XML см. В URL-адресе, указанном в коде.

Хотя это дает мне правильное количество продуктов для каждой отрасли, мне нужно сгруппировать его по категориям:

declare context item := doc("https://etutor.dke.uni-linz.ac.at/etutor/XML?id=1");
let $filialen := //filiale,
    $sortiment := //prodInsortiment,
    $produkte := //produkt,
    $kategorien := distinct-values(//produkt/kategorie)

for $f in $filialen
    let $s := $f//prodInSortiment
    let $scat := distinct-values($produkte[@ean = $s/ean]/kategorie)
    let $filsort := $produkte[@ean = $s/ean]/@ean
    let $catcount := count($scat)
    where $catcount = count(distinct-values($kategorien))

return
<filiale filialeNr="{$f/@filNr}"> 
{for $fs in $filsort return <ean>{$fs}</ean>
}
</filiale>

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

declare context item := doc("https://etutor.dke.uni-linz.ac.at/etutor/XML?id=1");
let $filialen := //filiale,
    $sortiment := //prodInsortiment,
    $produkte := //produkt,
    $kategorien := distinct-values(//produkt/kategorie)

for $f in $filialen
    let $s := $f//prodInSortiment
    let $scat := distinct-values($produkte[@ean = $s/ean]/kategorie)
    let $filsort := $produkte[@ean = $s/ean]/@ean
    let $catcount := count($scat)
    where $catcount = count(distinct-values($kategorien))

return
<filiale filialeNr="{$f/@filNr}"> 
{for $cat in $scat return 
<prodGruppe val = "{$cat}">
{for $fs in $filsort return <ean>{$fs}</ean>
}
</prodGruppe>
}
</filiale>

Результат должен выглядеть следующим образом (это правильный вывод для filiale "1"):

<filiale filialeNr="1">
<prodGruppe val="Pflege">
<ean>0-666-4567-2-22</ean>
<ean>0-777-4997-2-43</ean>
<ean>0-456-4887-3-22</ean>
<ean>0-55-48567-16-2</ean>
</prodGruppe>
<prodGruppe val="Ersatz">
<ean>1-626-7767-2-99</ean>
<ean>1-256-7700-2-00</ean>
<ean>1-333-7788-2-31</ean>
<ean>2-446-7240-9-15</ean>
<ean>9-396-7510-9-00</ean>
</prodGruppe>
<prodGruppe val="Audio">
<ean>7-2881-760-3-70</ean>
<ean>5-2671-955-5-55</ean>
<ean>1-4444-652-8-88</ean>
<ean>3-1111-654-3-99</ean>
</prodGruppe>
<prodGruppe val="Sonstiges">
<ean>6-581-1766-3-45</ean>
<ean>6-231-4777-3-15</ean>
<ean>4-1161-730-3-88</ean>
<ean>0-4381-880-7-00</ean>
<ean>5-6661-000-0-00</ean>
</prodGruppe>

Поскольку предстоящий среднесрочный экзамен, я не просто прошу решения, меня также интересуют возможные более простые способы достижения правильного результата. Заранее благодарен за любую полезную информацию!

1 Ответ

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

Если у вас есть предложение group-by в XQuery 3 (https://www.w3.org/TR/xquery-31/#id-group-by), вы можете переписать последний возврат в

return
<filiale filialeNr="{$f/@filNr}"> 
{
    for $prod in $s
    group by $cat := $produkte[@ean = $prod/ean]/kategorie
    return 
        <prodGruppe val = "{$cat}">
        {
            $prod/ean
        }
        </prodGruppe>
}
</filiale>

Я думаю.

...