Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select distinct-values according to child node in XQuery

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.

like image 437
slhck Avatar asked Mar 12 '11 15:03

slhck


1 Answers

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 As with different titles.

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)
like image 67
ax. Avatar answered Nov 09 '22 17:11

ax.