У меня есть еще одна маленькая проблема с 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>
Поскольку предстоящий среднесрочный экзамен, я не просто прошу решения, меня также интересуют возможные более простые способы достижения правильного результата.
Заранее благодарен за любую полезную информацию!