如何检查 NodeList 中的两个元素是否相同?最终,我正在检查 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>
当然,这只是解决方案的草图;您将需要填补错误报告等方面的空白。