XPATH使用XSL:key(key()函数



我试图根据某些节点值比较两个XML。

以下是两个XML:

a.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> 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>

基于 test 节点值,XSL的输出应为两个XML中的常见节点。

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

该行为被解释是因为catalog元素上下文中的那些XPATH/XSLT表达式:

  1. 没有密钥:cd[Test=document('a.xml')/catalog/cd/Test]

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

我的任何Test Childs的弦值等于任何一个 Test a.xml文档中的元素

  1. 使用键:cd[Test=key('cd', cd/Test, document('a.xml'))/Test]

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

我的任何Test Childs的弦值等于任何一个 Test由调用名为 cd的密钥引起的节点的孩子 a.xml文档的上下文,带有的字符串值 我所有孩子的Test cd

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

最新更新