我试图根据某些节点值比较两个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表达式:
- 没有密钥:
cd[Test=document('a.xml')/catalog/cd/Test]
在这里您将选择由谓词过滤的cd
元素:
我的任何
Test
Childs的弦值等于任何一个Test
a.xml
文档中的元素
- 使用键:
cd[Test=key('cd', cd/Test, document('a.xml'))/Test]
在这里您将选择由谓词过滤的cd
元素:
我的任何
Test
Childs的弦值等于任何一个Test
由调用名为cd
的密钥引起的节点的孩子a.xml
文档的上下文,带有的字符串值 我所有孩子的Test
cd
上一部分将是从任何cd
元素的上下文中评估的空节点集。