Let's say I have the following XML:
<info>
<channel>
<A>
<X>
<title>title1</title>
</X>
<Y value="20"/>
</A>
</channel>
<channel>
<A>
<X>
<title>title1</title>
</X>
<Y value="20"/>
</A>
<A>
<X>
<title>title2</title>
</X>
<Y value="20"/>
</A>
</channel>
</info>
and the following XQuery
{
for $A in doc('test.xml')//A
let $TITLE := $A/X/title
where string($A/Y/value) > 20
return
string($TITLE)
}
this, of course, outputs:
title1
title1
title2
How can I use distinct-values
in order to remove duplicates? I wonder because for
essentially only gives me one item per iteration and I can't call distinct-values
on $A
. Or is there any other way to remove duplicate output?
The problem is that I need to refer to another node, so basically calling distinct-values(doc...)
doesn't work, as it doesn't return nodes.
UPDATE
to filter duplicate nodes, use a variation of the xpath from this answer:
//A[index-of(//A/X/title, X/title)[1]]
this gives you all the A
s with different title
s.
you can expand this xpath expression to also filter on Y
- no need for XQuery FLWOR.
UPDATE END
apply the distinct-values
to the xpath expression over which you want to iterate:
for $title in distinct-values(doc('test.xml')//A/X/@title)
return string($title)
or just
distinct-values(doc('test.xml')//A/X/@title)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With