如何删除XQuery中的重复节点?

bra*_*ter 16 xquery duplicates

我有一个动态生成的XML文档,我需要一个函数来消除它的任何重复节点.

我的功能如下:

declare function local:start2() {
    let $data := local:scan_books()
    return <books>{$data}</books>
};
Run Code Online (Sandbox Code Playgroud)

示例输出是:

<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>
Run Code Online (Sandbox Code Playgroud)

我只想要我的书籍根标签中的一个条目,还有其他标签,比如说那里的小册子也需要删除重复项.有任何想法吗?


更新了以下评论.通过唯一节点,我的意思是删除多个具有完全相同内容和结构的节点.

Dim*_*hev 16

一种更简单,更直接的单行XPath解决方案:

只需使用以下XPath表达式:

  /*/book
        [index-of(/*/book/title, 
                  title
                 )
                  [1]
        ]
Run Code Online (Sandbox Code Playgroud)

例如,应用于以下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>
Run Code Online (Sandbox Code Playgroud)

上面的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>
Run Code Online (Sandbox Code Playgroud)

解释很简单:对于每一个book,只选择其出现次数的一个-使得其在指数的所有图书相同的第一指标title所有冠军.


Tra*_*ebb 5

你可以使用内置distinct-values()功能......