XQuery групиране на множество релационни елементи

Имам следния XML файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Manufacture>
<Fabrics>
    <Fabric fid="123456-1234" name="bmw"/>
    <Fabric fid="123456-2344" name="audi"/>
    <Fabric fid="123456-3454" name="fiat"/>
</Fabrics>
<Sections>
    <Section sectionID="1" fabricID="123456-1234" />
    <Section sectionID="2" fabricID="123456-2344" />
    <Section sectionID="3" fabricID="123456-1234" />
    <Section sectionID="4" fabricID="123456-3454" />
</Sections>
<Cars>
    <Car carID="1" section="1"/>
    <Car carID="2" section="3"/>
    <Car carID="3" section="2"/>
    <Car carID="4" section="4"/>
    <Car carID="5" section="3"/>
    <Car carID="6" section="2"/>
    <Car carID="7" section="3"/>
    <Car carID="8" section="1"/>
</Cars>
</Manufacture>

Как да постигна следното:

Показване на общия брой коли за всеки плат!?

това е:

<result fid="123456-1234" name="bmw" total="5"></result>
<result fid="123456-2344" name="audi" total="2"></result>
<result fid="123456-3454" name="fiat" total="1"></result>

fid в етикета Fabric е свързан с fabricID в етикета Section, неговият sectionID е свързан със раздела в етикета Car, оценявам всяка помощ :)


person user3128072    schedule 22.12.2013    source източник
comment
Бихте ли показали какво сте опитали досега? Също така: Желаният резултат прилича повече на изхода от XSLT обработка, отколкото на обикновена XPath заявка. Сигурни ли сте, че искате чист XPath?   -  person Marcus Rickert    schedule 23.12.2013
comment
Още нещо: изисквате ли резултатът да бъде написан с изрични затварящи тагове? Или може да са и обикновени XML тагове <result ... />?   -  person Marcus Rickert    schedule 23.12.2013
comment
Опитах много заявки, но без успех: ‹result›{ let $fabric :=for $fabrics in doc(data.xml)//fabrics return $fabrics let $section :=for $sections in doc(data.xml)/ /sections return $sections let $car := for $cars in doc(data.xml)//cars return $cars let $v:= for $ss in $fabric/fabric/@fid for $dd in $section/section [@sectionID=$ss] за $bb в $car/car[@section=$dd/@sectionID] ред по $ss връща $dd нека $tot:= за $i в (1 до 23), където $v[ $i]/@fid = $fabric/fabric[2]/@fid return ($v[$i]/@fid) return ‹fabric›{($tot)}total: {count($tot)}‹/ плат› }‹/резултат›   -  person user3128072    schedule 23.12.2013
comment
Не, отговорът може да бъде обикновен XML таг, т.е. ‹резултат ... /›   -  person user3128072    schedule 23.12.2013
comment
Какъв е този синтаксис, който използвате, закрепвайки вашите XPath изрази?   -  person Marcus Rickert    schedule 23.12.2013
comment
Аз съм много начинаещ в xquery, не знам как иначе бих могъл да пиша!?   -  person user3128072    schedule 23.12.2013
comment
Трябва да се извиня: все още не бях запознат с XQuery. Имам израз на XPath, който решава вашия проблем, но той все още трябва да бъде обвит в XQuery, който приемах като синоним на XPath досега (срам за мен!). Така че вашият синтаксис вероятно е наред! :-)   -  person Marcus Rickert    schedule 23.12.2013


Отговори (1)


Можеш да направиш нещо подобно...

data.xml

<Manufacture>
    <Fabrics>
        <Fabric fid="123456-1234" name="bmw"/>
        <Fabric fid="123456-2344" name="audi"/>
        <Fabric fid="123456-3454" name="fiat"/>
    </Fabrics>
    <Sections>
        <Section sectionID="1" fabricID="123456-1234" />
        <Section sectionID="2" fabricID="123456-2344" />
        <Section sectionID="3" fabricID="123456-1234" />
        <Section sectionID="4" fabricID="123456-3454" />
    </Sections>
    <Cars>
        <Car carID="1" section="1"/>
        <Car carID="2" section="3"/>
        <Car carID="3" section="2"/>
        <Car carID="4" section="4"/>
        <Car carID="5" section="3"/>
        <Car carID="6" section="2"/>
        <Car carID="7" section="3"/>
        <Car carID="8" section="1"/>
    </Cars>
</Manufacture>

XQuery

let $doc := doc('data.xml')/Manufacture
for $fabric in $doc/Fabrics/Fabric
return
    <result total="{count($doc/Cars/Car[@section=$doc/Sections/Section[@fabricID=$fabric/@fid]/@sectionID])}">
    {$fabric/@*}
    </result>

Резултати

<result total="5" fid="123456-1234" name="bmw"/>
<result total="2" fid="123456-2344" name="audi"/>
<result total="1" fid="123456-3454" name="fiat"/>
person Daniel Haley    schedule 23.12.2013
comment
+1 Не научи XQuery достатъчно бързо... Победен с три минути :-) - person Marcus Rickert; 23.12.2013