如何使用xquery从输入xml中删除重复节点

如何使用xquery从输入xml中删除重复节点,xml,xpath,xquery,Xml,Xpath,Xquery,下面是xquery中的Xml输入,我想删除重复元素 let $doc := <a> <b> <b1/> </b> <c> <c1/> <c1/> </c> <b> <b1/> &l

下面是xquery中的Xml输入,我想删除重复元素

    let $doc := <a>
        <b>
            <b1/>
        </b>
        <c>
            <c1/>
            <c1/>
        </c>
        <b>
            <b1/>
        </b>
        <d>
            <d1>
                <d11/>     
                <d11/>
            </d1>
        </d>
    </a>

return distinct-values($doc)
预期输出:我的预期输出低于意味着从输入中删除重复节点

<a>
    <b>
        <b1/>
    </b>
    <c>
        <c1/>
    </c>
    <d>
        <d1>
            <d11/>
        </d1>
    </d>
</a>
谢谢..

函数distinct values创建一系列不同的原子值,如字符串、数字、日期。要识别和消除重复节点,我们首先需要了解如何定义一个节点是另一个节点的重复,无论是仅基于子元素结构还是基于值

您似乎还希望递归地消除重复项,因此,为了给您一个使用递归函数的示例,该函数通过调用XQuery 3中的serialize函数的结果对所有子级进行分组,下面是一个示例:

declare function local:eliminate-duplicates($element as element())
{
    element { $element => node-name() }
    {
        for $child at $child-pos in $element/*
        group by $xml := serialize($child)
        order by head($child-pos)
        return
            $child => head() => local:eliminate-duplicates()
    }
};

let $a := <a>
        <b>
            <b1/>
        </b>
        <c>
            <c1/>
            <c1/>
        </c>
        <b>
            <b1/>
        </b>
        <d>
            <d1>
                <d11/>     
                <d11/>
            </d1>
        </d>
    </a>
return 
    local:eliminate-duplicates($a)
结果是


请回复以上任何人question@Ansari,您没有重复的节点,这是错误的xml!您能否更详细地解释一下如何定义一个节点何时是另一个节点的副本?不同的值对原子值序列起作用,因此您可以使用它来消除数字、字符串或日期序列中的重复项。对于节点,可以按序列化和递归进行分组(如果需要):
<a>
   <b>
      <b1/>
   </b>
   <c>
      <c1/>
   </c>
   <d>
      <d1>
         <d11/>
      </d1>
   </d>
</a>