【问题标题】:XPath Filtering with xsl:key() function使用 xsl:key() 函数进行 XPath 过滤
【发布时间】:2019-02-22 20:06:16
【问题描述】:

我正在尝试根据某个节点值比较两个 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 的内容作为键来比较 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 中的公共节点,基于 Test 节点值。

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

【问题讨论】:

  • 是因为应该是&lt;xsl:copy-of select="cd[Test=key('cd', Test, document('a.xml'))/Test]"/&gt;,还是只是&lt;xsl:copy-of select="cd[key('cd', Test, document('a.xml'))]"/&gt;

标签: xml xslt xpath xslkey


【解决方案1】:

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

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

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

我的任何Test childs 的字符串值都等于其中任何一个 Testa.xml 文档中的元素

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

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

我的任何Test childs 的字符串值都等于其中任何一个 Test 调用名为 cd 的键产生的节点的子节点 a.xml 文档的上下文,字符串值为 all my grandsons Test 我所有的孩子cd

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多