獲取不同節點的問題是如何確定兩個節點是不同的。這是XML中的一個複雜主題。如果重複節點具有相同的節點標識(即:它們引用相同的節點),那麼您可以使用像functx:distinct-nodes()這樣的功能。否則,您需要某種類型的散列來確定節點是否「足夠平等」以被視爲相等,或者使用deep-equal()進行比較,對於大型數據集來說性能較差。
如果兩個<author>
s爲相等時,最後一個和名字是相同的,那麼你可以使用作爲concat(last,first)
作爲哈希一樣簡單的東西,使用XPath得到不同的值:
$xml/author[index-of($xml/author/concat(last,first), concat(last,first))[1]]
這仍然ISN」因爲你在每一步計算哈希,所以它會減慢大數據集的速度。爲了提高性能,有一兩件事你可以做的是預先計算對數據的哈希值,即:
<author hash="ShakespearWilliam">
<last>Shakespear</last>
<first>William</first>
</author>
和:
$xml/author[index-of($xml/author/@hash, @hash)[1]]
如果你能最有效地獲得理想的使用有序通過哈希節點(訂購數據庫索引),則有刪除重複的更有效的方法:
declare function local:nodupes($first, $rest)
{
if (empty($rest)) then $first
else if ($first/@hash eq $rest[1]/@hash)
then local:nodupes($rest[1], subsequence($rest,2))
else ($first, local:nodupes($rest[1], subsequence($rest,2)))
};
然後調用與您的有序集合:
let $ordered :=
for $a in $xml/author
order by $a/@hash
return $a
return
local:nodupes((),$ordered)
來源
2012-10-02 16:27:41
wst
不同值的很好的xpath表達式 – Jayy