0

我正在尝试根据某些节点值比较两个 xml。

下面是两个xml:

一个.xml

<?xml version="1.0"?>
<catalog>
    <cd>
        <Test>a</Test>
        <Test1>aa</Test1>
    </cd>
    <cd>
        <Test>e</Test>
        <Test1>ee</Test1>
    </cd>
    <cd>
        <Test>f</Test>
        <Test1>ff</Test1>
    </cd>
    <cd>
        <Test>c</Test>
        <Test1>cc</Test1>
    </cd>
</catalog>

b.xml

<?xml version="1.0"?>
<catalog>
    <cd>
        <Test>a</Test>
        <Test1>aa</Test1>
    </cd>
    <cd>
        <Test>b</Test>
        <Test1>bb</Test1>
    </cd>
    <cd>
        <Test>c</Test>
        <Test1>cc</Test1>
    </cd>
</catalog>

我正在尝试使用Test的内容作为键来比较 xml。

下面是我正在使用的 xsl:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
    <xsl:key name="cd" match="cd" use="Test"/>
    <xsl:template match="/catalog">
        <!-- This is working -->
        <xsl:copy>
            <xsl:copy-of select="cd[Test=document('a.xml')/catalog/cd/Test]"/>
        </xsl:copy>
        <!--This is not working-->
        <xsl:copy>
            <xsl:copy-of select="cd[Test=key('cd', cd/Test, document('a.xml'))/Test]"/>
        </xsl:copy>
        <!--This is returning node-set-->
        <xsl:message>
            <xsl:copy-of select="document('a.xml')/catalog/cd/Test"/>
        </xsl:message>
        <!--This is returning node-set-->
        <xsl:message>
            <xsl:copy-of select="key('cd', cd/Test, document('a.xml'))/Test"/>
        </xsl:message>
    </xsl:template>
</xsl:stylesheet>

根据测试节点值,xsl 的输出应该是两个 xml 中的公共节点。

但不确定为什么使用 xsl:key() 函数的那个​​不起作用。当我单独打印它时,它显示了正确的节点集。

4

1 回答 1

2

catalog由于元素上下文中的那些 XPath/XSLT 表达式,解释了该行为:

  1. 无钥匙:cd[Test=document('a.xml')/catalog/cd/Test]

在这里,您将选择cd由谓词过滤的元素:

我的任何Test孩子的字符串值都等于 文档中的任何这些Test元素a.xml

  1. 带钥匙:cd[Test=key('cd', cd/Test, document('a.xml'))/Test]

在这里,您将选择cd由谓词过滤的元素:

我的任何Test孩子的字符串值都等于 通过调用在文档上下文中命名的键和我所有孩子的所有孙子 Test的字符串值而产生的节点的任何孩子cda.xmlTestcd

最后一部分将是从任何cd元素的上下文评估的空节点集。

于 2019-02-22T21:38:53.987 回答