如何使用xslt 1.0和xpath 1.0检查两个节点是否相等(在叶子上具有相同的树结构且具有相同的值)?

时间:2014-10-01 16:01:55

标签: xslt xpath xslt-1.0

我有两个结构未知的节点,例如:

<EXAMPLE1>
    <A>text a</A>
    <B>
        <C>text c</C>
        <D>
            <E>text e</E>
            <A>text second A</A>
        </D>
    </B>
</EXAMPLE1>

<EXAMPLE2>
    <A>text a</A>
    <B>
        <C_DIFFERENT>text c</C_DIFFERENT>
        <D>
            <E>DIFFERENT TEXT</E>
            <A>text second A</A>
        </D>
    </B>
</EXAMPLE2>

它们可能是完全等于(只有不同​​的基本名称),但可能不同(具有另一个值或不同的标签集)。

任务是检查,是否等同。

我创造了这个:

            <xsl:for-each select="//EXAMPLE1//*[not(*)]">
                <xsl:if test="not(//EXAMPLE2//*[not(*) and name() = name(current())]) or //EXAMPLE2//*[not(*) and name() = name(current())]/text() != current()/text()">

                <!-- PRINT MY STUFF --> 

                </xsl:if>
            </xsl:for-each>
            <xsl:for-each select="//EXAMPLE2//*[not(*)]">
                <xsl:if test="not(//EXAMPLE1//*[not(*) and name() = name(current())]) or //EXAMPLE1//*[not(*) and name() = name(current())]/text() != current()/text()">

                <!-- PRINT MY STUFF --> 

                </xsl:if>
            </xsl:for-each>

(我尝试移动EXAMPLE1的所有叶节点,在EXAMPLE2中搜索相同的内容并检查是否存在相同的值,然后对于EXAMPLE2和EXAMPLE1执行相同的操作)

但它不起作用,因为,例如,有一个名称出现两次的节点,我不能先与第一个和第二个进行比较。我必须打印我的东西&#34;就好像他们是平等的。

它看起来像自行车,我希望XSLT 1.0有更多有用和简单的东西,然后是这样的结构。

拜托,帮帮我找到它。

1 个答案:

答案 0 :(得分:0)

计算第一个子树的哈希值(最简单的可能就是按照您访问的顺序连接所有元素名称和值以及属性名称和值)。然后使用相同的模板计算第二个子树的哈希并比较哈希值。 (请注意,它不是100%正确,因为根据Xml规则,属性的顺序无关紧要,而在这种情况下,散列会有所不同,但我认为在你的场景中应该没问题)