我有一个动态生成的 XML 文档,我需要一个函数来消除其中的任何重复节点。
我的功能看起来像:
declare function local:start2() {
let $data := local:scan_books()
return <books>{$data}</books>
};
示例输出为:
<books>
<book>
<title>XML in 24 hours</title>
<author>Some Guy</author>
</book>
<book>
<title>XML in 24 hours</title>
<author>Some Guy</author>
</book>
</books>
我只想要我的书根标签中的一个条目,还有其他标签,比如那里的小册子也需要删除重复项。有任何想法吗?
更新了以下评论。通过唯一节点,我的意思是删除多次出现的具有完全相同内容和结构的节点。
最佳答案
一种更简单、更直接的单行 XPath 解决方案 :
只需使用以下 XPath 表达式:
/*/book
[index-of(/*/book/title,
title
)
[1]
]
例如,应用于以下 XML 文档 时:
<books>
<book>
<title>XML in 24 hours</title>
<author>Some Guy</author>
</book>
<book>
<title>Food in Seattle</title>
<author>Some Guy2</author>
</book>
<book>
<title>XML in 24 hours</title>
<author>Some Guy</author>
</book>
<book>
<title>Food in Seattle</title>
<author>Some Guy2</author>
</book>
<book>
<title>How to solve XPAth Problems</title>
<author>Me</author>
</book>
</books>
上面的 XPath 表达式正确选择了以下节点 :
<book>
<title>XML in 24 hours</title>
<author>Some Guy</author>
</book>
<book>
<title>Food in Seattle</title>
<author>Some Guy2</author>
</book>
<book>
<title>How to solve XPAth Problems</title>
<author>Me</author>
</book>
解释很简单:对于每个
book
,只选择它的一个出现——这样它在所有书籍中的索引与其 title
的第一个索引相同在所有标题中。
关于duplicates - 如何删除 XQuery 中的重复节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/644384/