NodeList の 2 つの要素が同一かどうかを確認するにはどうすればよいですか? 最終的に、XML ファイルに重複する要素があるかどうかを確認しています。
たとえば、次のようなことが発生した場合に例外をスローします。
<type id="foo">
</type>
<type id="foo">
</type>
原則として、deep-equal を使用してすべての要素を他のすべての要素と比較します。たとえば、
for $i in $nodes
for $j in $nodes
if (deep-equal($i, $j) and not($i is $j))
then error() else ()
(これは XPath 2.0 または XQuery 1.0 です)。
ノード数が非常に多い場合、これは非効率的です。より良い解決策は、いくつかのハッシュ関数でノードをグループ化し、同じグループ内のノードのみを比較することです。適切なハッシュ関数を考案するには、おそらくデータに関する知識が必要です。次に、次のように XSLT 2.0 を使用できます。
<xsl:for-each-group select="$nodes" group-by="my:hash(.)">
<xsl:variable name="group" select="current-group()"/>
<xsl:sequence select="
for $i in $group
for $j in $group
if (deep-equal($i, $j) and not($i is $j))
then error() else ()"/>
</xsl:for-each-group>
もちろん、これはソリューションのスケッチにすぎません。エラー報告などのギャップを埋めたいと思うでしょう。