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

问题描述 投票:0回答:1

下面是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>

谢谢..

xml xpath xquery
1个回答
0
投票

函数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)

https://xqueryfiddle.liberty-development.net/gWmuPrX/2的结果是

<a>
   <b>
      <b1/>
   </b>
   <c>
      <c1/>
   </c>
   <d>
      <d1>
         <d11/>
      </d1>
   </d>
</a>
© www.soinside.com 2019 - 2024. All rights reserved.