0

如何检查 NodeList 中的两个元素是否相同?最终,我正在检查 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 回答