0

NodeList の 2 つの要素が同一かどうかを確認するにはどうすればよいですか? 最終的に、XML ファイルに重複する要素があるかどうかを確認しています。

たとえば、次のようなことが発生した場合に例外をスローします。

<type id="foo">
</type>
<type id="foo">
</type>
4

1 に答える 1

0

原則として、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>

もちろん、これはソリューションのスケッチにすぎません。エラー報告などのギャップを埋めたいと思うでしょう。

于 2013-09-21T08:02:32.287 に答える