从返回XQuery中删除重复项

时间:2013-06-01 14:32:39

标签: xml xquery basex xquery-3.0

我的XQuery是:

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

返回:name="city" name="city" name="city" name="city" name="city"

当我添加区分值时,如:

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)

返回:city city city city city

我只需要返回一个“城市”我该怎么办?

3 个答案:

答案 0 :(得分:7)

您需要对整个结果应用distinct-values函数(即,不要对每个结果项目应用):

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
)

查询也可以写为单个XPath表达式:

distinct-values(//xs:element/@name[contains(., 'city')])

答案 1 :(得分:3)

使用group by。您的查询多次返回city,因为在每次迭代(for循环)中,$attr中只有一个这样的元素。所以你在单个元素上做distinct-values,但是你多次这样做。

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

答案 2 :(得分:0)

这项工作

distinct-values(for $schema in xsd:schema
for $nodes in $schema//*,
    $attr in $nodes/xsd:element/@name
where fn:contains($attr,'city')
return distinct-values($attr))