Я решил свою проблему, реализовав рекурсивную функцию поиска уникальности, основанную исключительно на текстовом содержимом моего документа для сопоставления уникальности.
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>
Полагаю, если вам нужно немного отличающееся сопоставление эквивалентности, вы можете соответствующим образом изменить сопоставление в алгоритме. В любом случае, вам следует начать.