Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove duplicates from return XQuery

My XQuery is:

declare namespace xsd="http://www.w3.org/2001/XMLSchema"; 
for $schema in xsd:schema
for $nodes in $schema//*,
    $attr in $nodes/xsd:element/@name
where fn:contains($attr,'city')
return $attr

return: name="city" name="city" name="city" name="city" name="city"

When I add distinct-values like:

declare namespace xsd="http://www.w3.org/2001/XMLSchema"; 
for $schema in xsd:schema
for $nodes in $schema//*,
    $attr in $nodes/xsd:element/@name
where fn:contains($attr,'city')
return distinct-values($attr)

return: city city city city city

I need only one "city", how can I do it ?

like image 901
Peter Fašianok Avatar asked Jun 01 '13 14:06

Peter Fašianok


2 Answers

You need to apply the distinct-values function on the whole result (i. e., not to each single result item):

declare namespace xsd="http://www.w3.org/2001/XMLSchema"; 
distinct-values(
  for $schema in xsd:schema
  for $nodes in $schema//*,
      $attr in $nodes/xsd:element/@name
  where fn:contains($attr,'city')
  return $attr
)

The query can also be written as a single XPath expression:

distinct-values(//xs:element/@name[contains(., 'city')])
like image 51
Christian Grün Avatar answered Nov 16 '22 17:11

Christian Grün


Use group by. Your query returns multiple times city, because in each iteration (of the for loop) there is only one such element in $attr. So you are doing the distinct-values on a single element, but you are doing this multiple times.

declare namespace xsd="http://www.w3.org/2001/XMLSchema"; 
for $schema in xsd:schema
for $nodes in $schema//*,
    $attr in $nodes/xsd:element/@name
where fn:contains($attr,'city')
group by $attr
return $attr
like image 4
dirkk Avatar answered Nov 16 '22 18:11

dirkk