5

我的 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

我只需要一个“城市”,我该怎么做?

4

3 回答 3

8

您需要将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')])
于 2013-06-01T15:12:00.207 回答
4

使用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
于 2013-06-01T15:08:03.583 回答
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))
于 2013-06-01T15:14:10.463 回答