如何检查nodeList中的两个元素是否相同?

时间:2013-09-20 21:48:14

标签: xml arrays nodelist

如何检查NodeList中的两个元素是否相同?最后,我正在检查XML文件中是否存在重复的元素。

E.g。如果发生以下情况,我想抛出异常:

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

1 个答案:

答案 0 :(得分:0)

原则上,使用深度相等比较每个元素,例如

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>

这只是一个解决方案的草图;你想填补错误报告等方面的空白。