他の初心者に役立つ場合に備えて、これを行っている間に学んだ情報を追加する価値があると思いました。テスト コード名を変更して、xsl で使用されている用語と混同しないようにしました。それが最善の方法なのか、最も効率的な方法なのかはわかりませんが、うまくいきます (いくつか注意点があります!)。
「情報」ノードを保持したかったのですが、元のコードではそれが失われました。別の一致テンプレートをコーディングすると、それが出力に保持されます。また、私がコーディングした方法では、このノードは入力ファイル (x1) にある場合にのみ保持されます。(x2) ファイルにある場合は、保持されません。これは、私が繰り返しを書いた方法である必要があります。理想的には、どちらの入力ファイルからも保持したいのですが、まだその方法を考え出していません。また、ファイル名 x2 をハード コードするのではなく、msxsl を介してパラメーターとして渡すオプションが必要です。確かにこれを行う方法があるに違いありませんが、まだ追跡できていません。
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>
out.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>