如何减少 XQuery 结果中的重复节点?
How to reduce duplicated nodes in XQuery result?
目前,我遇到了重复节点的问题。
这是我遇到重复节点结果的查询。
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>
我了解查询中的问题,为什么会出现重复项。但是:我怎样才能得到没有重复的结果?
问题是您计算叉积,然后对其进行过滤。有不同的方法可以缓解这种情况。一个明显的方法是 return 只有不同的值:
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>
但这感觉就像一个可怕的黑客攻击。最好确保您只 returning "first" 结果,这可以在 where
子句中使用节点顺序运算符 <<
来完成:
for $cityA in doc("countries.xml")//city
for $cityB in doc("countries.xml")//city
where not ($cityA is $cityB) and $cityA/name = $cityB/name
where $cityA << $cityB
return $cityA/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>
目前,我遇到了重复节点的问题。 这是我遇到重复节点结果的查询。
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>
我了解查询中的问题,为什么会出现重复项。但是:我怎样才能得到没有重复的结果?
问题是您计算叉积,然后对其进行过滤。有不同的方法可以缓解这种情况。一个明显的方法是 return 只有不同的值:
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>
但这感觉就像一个可怕的黑客攻击。最好确保您只 returning "first" 结果,这可以在 where
子句中使用节点顺序运算符 <<
来完成:
for $cityA in doc("countries.xml")//city
for $cityB in doc("countries.xml")//city
where not ($cityA is $cityB) and $cityA/name = $cityB/name
where $cityA << $cityB
return $cityA/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>