Xpath Xquery:基于多个值获取具有唯一性的块

Xpath Xquery:基于多个值获取具有唯一性的块,xpath,xquery,xquery-3.0,Xpath,Xquery,Xquery 3.0,我试图从下面的XML中获取唯一的数据集 <output> <category>DB</category> <title>Database systems</title> <name>Smith</name> <name>John</name> <name>Adam</name> </output> <output> &

我试图从下面的XML中获取唯一的数据集

<output>
  <category>DB</category>
  <title>Database systems</title>
  <name>Smith</name>
  <name>John</name>
  <name>Adam</name>
</output>
<output>
  <category>DB</category>
  <title>Database systems</title>
  <name>John</name>
  <name>Smith</name>
  <name>Adam</name>
</output>
<output>
  <category>DB</category>
  <title>Database systems</title>
  <name>Adam</name>
  <name>Smith</name>
  <name>John</name>
</output>
<output>
  <category>Others</category>
  <title>Pattern Recognition</title>
  <name>Adam</name>
  <name>Jeff</name>
</output>
<output>
  <category>Others</category>
  <title>Pattern Recognition</title>
  <name>Jeff</name>
  <name>Adam</name>
</output>
输出

DBDatabase systemsSmithJohnAdam
DBDatabase systemsJohnSmithAdam
DBDatabase systemsAdamSmithJohn
期望

<output>
  <category>DB</category>
  <title>Database systems</title>
  <name>Smith</name>
  <name>John</name>
  <name>Adam</name>
</output>
<output>
  <category>Others</category>
  <title>Pattern Recognition</title>
  <name>Adam</name>
  <name>Jeff</name>
</output>

分贝
数据库系统
史密斯
约翰
亚当
其他
模式识别
亚当
杰夫
无需订购 我试着对名称标签进行排序,但没有成功,因为它给代码增加了太多内容。 Xquery中是否存在从上述XML获取一个副本的逻辑?

一个选项可以是:

doc("data.xml")//output/*[not(preceding::*=.)]
输出:

<category>DB</category>
<title>Database systems</title>
<name>Smith</name>
<name>John</name>
<name>Adam</name>
DB
数据库系统
史密斯
约翰
亚当

在实际的xml上尝试以下方法:

let $inv :=
<doc>
 [your xml above]
</doc>
let $titles := $inv//output/title
for $title in distinct-values($titles)
return $inv//output[title[$title]][1]
让$inv:=
[上面的xml文件]
让$titles:=$inv//output/title
对于不同值的$title($titles)
返回$inv//output[title[$title]][1]
输出:

<output>
  <category>DB</category>
  <title>Database systems</title>
  <name>Smith</name>
  <name>John</name>
  <name>Adam</name>
</output>
<output>
  <category>Others</category>
  <title>Pattern Recognition</title>
  <name>Adam</name>
  <name>Jeff</name>
</output>

分贝
数据库系统
史密斯
约翰
亚当
其他
模式识别
亚当
杰夫

在XQuery 3中,我认为最短、最有效的方法是使用
分组方式:

for $output in //output
group by $title := $output/title
return head($output)

三个
元素在结构上不同,因此简单的
深度相等(…)
不起作用。当你完全考虑两个元素包含“相同的信息”?如果一个
在其中一个中重复了怎么办?你只想忽略排序吗?如果3代码> <代码>标签是“等价”的,为什么不抓取第一个(<代码> [1 ] < /COD>)标签及其子?我认为两个元素在它们的信息相同时是相等的。将上述情况视为教科书和作者。这三个都是一样的。我不能只取第一个,因为这是许多其他教科书中的一个示例,重复的次数也不同。如果是这样,您可能需要扩展问题中的示例xml,以显示另一个示例以及这些示例之间的关系;例如,“相同的信息”是按顺序重复的(例如,如在您的问题中,一行重复3次),还是可以与另一本书/作者的“相同信息”混合?更新了问题。“标题”是这里的关键。需要了解书籍及其作者。您可以假设同一本书没有其他条目包含不同的作者。谢谢。这对我起了作用:)我不能提高投票率,因为我是新来的,而且还没有足够的声誉。@Rachi不担心;很高兴它对你有用!
for $output in //output
group by $title := $output/title
return head($output)