如何使用xslt 1.0和xpath 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处搜索相同的节点,并检查是否存在相同的节点以及它是否具有相同的值,然后对EXAMPLE3和EXAMPLE4执行相同的操作)

但它不起作用,因为,例如,有一个名为的节点出现了两次,我无法将第一个与第一个进行比较,将第二个与第二个进行比较。我必须"打印我的东西",只要它们是相等的。

而且它看起来像自行车,我希望XSLT1.0有一些更有用、更简单的东西,然后是这样的构造。

请帮我找到它。

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

相关内容

  • 没有找到相关文章

最新更新