0
votes

XML File

<map>

    <links>
        <link id="10" ordernum="0"></link>
        <link id="20" ordernum="1"></link>
        <link id="30" ordernum="2"></link>
    </links>

    <products>
        <product id="10" group="2">...</product>
        <product id="20" group="1">...</product>
        <product id="30" group="2">...</product>
    </products>

</map>

I'm using the following Xquery to get the products/@id, ordered by the corresponding link/@ordernum but only once for the same group.

for $linkid in //links/link
order by $linkid/@ordernum
return distinct-values(data(//products/product[@id=data($linkid/@id)]/@id))

Expected output: 10, 20

Received output: 10, 20, 30

1

1 Answers

1
votes

It's returning all products because all product id's match a link id. (This part of your return statement: product[@id=data($linkid/@id)])

Maybe try doing the for loop over the product groups first...

for $prodgroup in distinct-values(/map/products/product/@group)
let $prodid := /map/products/(product[@group=$prodgroup])[1]/@id
order by /map/links/link[@id = $prodid]/@ordernum
return data(/map/products/product[@id=$prodid]/@id)