<config>
<state version="10">
<root value="100" group="5">
<leaf number = "2"/>
</root>
<action value="2" step="4">
<get score = "5"/>
</action>
</state>
</config>
<config>
<state version="10">
<root value="100" group="5">
<leaf number = "6"/>
</root>
<parent>
<child node="yes"/>
</parent>
</state>
</config>
<config>
<state version="10">
<root value="100" group="5">
<leaf number = "2"/>
<leaf number = "6"/>
</root>
<action value="2" step="4">
<get score = "5"/>
</action>
<parent>
<child node="yes"/>
</parent>
</state>
</config>
这是对此处的跟进问题:Merge 2 XML files based on attribute values using XSLT?
我在每个XML文件中有2个不同的标签(file1.xml中的操作标记和file2.xml中的父标记),并且在遍历公共标记()之后我需要它们都出现在输出文件中。
请帮我写一个XSLT,确保这两个标签都反映在输出中。
答案 0 :(得分:0)
看看JLRishie的答案,我们给出了以下模板来复制匹配的 root 元素:
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
<xsl:copy-of
select="document('file2.xml')
/config/state[@version = current()/../@version]
/root[@value = current()/@value and
@group = current()/@group]/*" />
</xsl:copy>
</xsl:template>
要扩展此功能以从file2.xml获取非 root 元素,您可以添加新模板以匹配file1.xml中的状态元素,然后复制file2.xml中的非root元素
<xsl:template match="state">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
<xsl:copy-of
select="document('file2.xml')
/config/state[@version = current()/@version]/*[not(self::root)]" />
</xsl:copy>
</xsl:template>
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="state">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:copy-of select="document('file2.xml')
/config/state[@version = current()/@version]
/*[not(self::root)]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:copy-of select="document('file2.xml')
/config/state[@version = current()/../@version]
/root[@value = current()/@value and
@group = current()/@group]/*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于两个XML文件时,输出以下内容
<config>
<state version="10">
<root value="100" group="5">
<leaf number="2"/>
<leaf number="6"/>
</root>
<action value="2" step="4">
<get score="5"/>
</action>
<parent>
<child node="yes"/>
</parent>
</state>
</config>