我认为值得添加一些我在执行此操作时学到的额外信息,以防它对任何其他初学者有用。我已经更改了我的测试代码名称,以便它们不会与 xsl 中使用的某些术语混淆。我不知道这是否是最好或最有效的做事方式,但它确实有效(有一些警告!)。
我想保留“信息”节点,原始代码丢失了它。编写一个单独的匹配模板将其保留在输出中。另外,按照我的编码方式,这个节点只有在输入文件 (x1) 中才会保留。如果它在 (x2) 文件中,则不会保留。这必须与我编写迭代的方式有关。理想情况下,我想将其保留在任一输入文件中,但还没有弄清楚如何做到这一点。另外,我希望可以选择通过 msxsl 将文件名 x2 作为参数传递,而不是对其进行硬编码。肯定有办法做到这一点,但我还没有设法找到它。
xsl 文件:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kElementByType" match="*[not(self::keynode)]" use="../keynode"/>
<xsl:param name="pSource2" select="'x2.xml'"/>
<xsl:variable name="vSource2" select="document($pSource2,/)"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="info">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="keynode">
<xsl:variable name="vCurrent" select="."/>
<xsl:call-template name="identity"/>
<xsl:for-each select="$vSource2">
<xsl:apply-templates select="key('kElementByType',$vCurrent)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
因此,使用 msxls 命令:
msxsl.exe x1.xml test.xsl -o out.xml
使用以下数据给出以下结果:
文件 x1.xml:
<root>
<info>
<id>147</id>
</info>
<nodetype>
<keynode>annajon</keynode>
<note>
<source>source1</source>
<name>Anna Jones</name>
</note>
</nodetype>
<nodetype>
<keynode>brucejon</keynode>
<note>
<source>source1</source>
<name>Bruce Jones</name>
</note>
</nodetype>
</root>
文件 x2.xml:
<root>
<nodetype>
<keynode>annajon</keynode>
<note>
<source>source2</source>
<name>Anna Jones</name>
</note>
</nodetype>
<nodetype>
<keynode>iangore</keynode>
<note>
<source>source2</source>
<name>Ian Gore</name>
</note>
</nodetype>
</root>
出.xml:
<?xml version="1.0" encoding="UTF-16"?><root>
<info>
<id>147</id>
</info>
<nodetype>
<keynode>annajon</keynode><note>
<source>source2</source>
<name>Anna Jones</name>
</note>
<note>
<source>source1</source>
<name>Anna Jones</name>
</note>
</nodetype>
<nodetype>
<keynode>brucejon</keynode>
<note>
<source>source1</source>
<name>Bruce Jones</name>
</note>
</nodetype>
</root>