我有一个动态生成的XML文档,我需要一个函数来消除其中的任何重复节点。
我的函数如下所示:
declare function local:start2() {
let $data := local:scan_books()
return <books>{$data}</books>
};
示例输出为:
<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>
我只想要我的图书根标签中的一个条目,还有其他标签,比如里面的小册子也需要去掉重复的内容。有什么想法吗?
更新了以下评论。我所说的唯一节点是指删除具有完全相同的内容和结构的节点的多个实例。
发布于 2010-03-11 13:44:52
您可以使用内置的distinct-values()
函数...
发布于 2009-03-13 22:50:38
我通过实现递归的唯一性搜索功能解决了这个问题,该功能仅基于文档的文本内容进行唯一性匹配。
declare function ssd:unique-elements($list, $rules, $unique) {
let $element := subsequence($rules, 1, 1)
let $return :=
if ($element) then
if (index-of($list, $element) >= 1) then
ssd:unique-elements(insert-before($element, 1, $list), subsequence($rules, 2), $unique)
else <test>
<unique>{$element}</unique>
{ssd:unique-elements(insert-before($element, 1, $list), subsequence($rules, 2), insert-before($element, 1, $unique))/*}
</test>
else ()
return $return
};
调用方式如下:
declare function ssd:start2() {
let $data := ()
let $sift-this :=
<test>
<data>123</data>
<data>456</data>
<data>123</data>
<data>456</data>
<more-data>456</more-data>
</test>
return ssd:unique-elements($data, $sift-this/*, ())/*/*
};
ssd:start2()
输出:
<?xml version="1.0" encoding="UTF-8"?>
<data>123</data>
<data>456</data>
我猜如果你需要稍微不同的等价匹配,你可以相应地改变算法中的匹配。不管怎么说,这应该能让你入门。
发布于 2010-05-30 03:02:43
那么fn:distinct-values呢?
https://stackoverflow.com/questions/644384
复制相似问题