【问题标题】:How to drop the duplicate node from input xml using xquery如何使用 xquery 从输入 xml 中删除重复节点
【发布时间】:2020-01-03 06:50:25
【问题描述】:

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

谢谢..

【问题讨论】:

  • 请回复以上问题的任何人
  • @Ansari,你没有duplicate node,这是错误xml
  • 您能否更详细地解释一下您如何定义一个节点何时与另一个节点重复? distinct-values 适用于原子值序列,因此您可以使用它来消除数字或字符串或日期序列中的重复项。对于节点,您可以按序列化和递归分组,如果这是您想要的:xqueryfiddle.liberty-development.net/gWmuPrX/2

标签: xml xpath xquery


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多