下面是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)
https://xqueryfiddle.liberty-development.net/gWmuPrX/2的结果是
<a>
<b>
<b1/>
</b>
<c>
<c1/>
</c>
<d>
<d1>
<d11/>
</d1>
</d>
</a>