如何减少XQuery结果中的重复节点?

如何减少XQuery结果中的重复节点?,xquery,Xquery,目前,我有一个问题,在重复节点。 这里是我遇到重复节点结果的查询 for $cityA in doc("countries.xml")//city for $cityB in doc("countries.xml")//city where not ($cityA is $cityB) and $cityA/name = $cityB/name return $cityA/name 我的查询结果如下所示: <name>Hyderabad</name> <name&

目前,我有一个问题,在重复节点。 这里是我遇到重复节点结果的查询

for $cityA in doc("countries.xml")//city
for $cityB in doc("countries.xml")//city
where not ($cityA is $cityB) and $cityA/name = $cityB/name
return $cityA/name
我的查询结果如下所示:

<name>Hyderabad</name>
<name>Hyderabad</name>
海得拉巴 海得拉巴 但我想要的是:

<name>Hyderabad</name>
海得拉巴 我理解我的查询中的问题,为什么会出现重复。但是:我怎样才能得到一个没有重复的结果呢


问题是你要计算叉积,然后过滤叉积。有不同的方法来缓解这一问题。一个显而易见的方法是只返回不同的值:

for $city in distinct-values(
  for $cityA in doc("countries.xml")//city
  for $cityB in doc("countries.xml")//city
  where not ($cityA is $cityB) and $cityA/name = $cityB/name
  return $cityA/name
)
return <name>{ $city }</name>
但是,这仍然有不必要的显式叉积。您可以通过更改查询来执行以下操作:

for $city in doc("countries.xml")//city
where $city/following::city[name=$city/name]
return $city/name
这一个循环遍历所有城市,并选择那些稍后在文档中出现另一个具有相同值的城市。您甚至可以使用谓词在一行中使用纯XPath 1.0(XQuery的子集)执行相同的查询:

doc("countries.xml")//city[following::city/name=name]/name

在XQuery 3.0中,可以使用分组

for $city in doc('countries.xml')//city
group by $name := $city/name
where count($city) ge 2
return <name>{$name}</city>
$city在doc('countries.xml')//city中的

按$name分组:=$city/name
何处计数($city)ge 2
返回{$name}

+1这是一个非常完美的问题,包括示例输入、您尝试过的内容、当前和预期的输出以及清晰的错误陈述!
for $city in doc('countries.xml')//city
group by $name := $city/name
where count($city) ge 2
return <name>{$name}</city>