考虑以下两个文件:
file1.xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>
<bar1 id="1">
<el1 id="1.1">Bar1 el1</el1>
<el2 nil="yes" />
</bar1>
<bar2 id="2" nil="yes" />
<bar3 id="3">
<el1>Bar3 el1</el1>
<el2>
<someValue1>5</someValue1>
</el2>
</bar3>
</foo>
</root>
file2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<trunk>
<bar2 id="2">
<someValue2>11</someValue2>
</bar2>
<bar3 id="3">
<el2>
<someValue3>8</someValue3>
</el2>
</bar3>
</trunk>
我想将这两个文件合并为以下规则: - 应该添加File2(trunk)来覆盖File1(root / foo)中的数据; - 如果File1中已存在元素,则只应替换现有数据,但应保留所有子元素。这种情况的结果应该是:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>
<bar1 id="1">
<el1 id="1.1">Bar1 el1</el1>
<el2 nil="yes"/>
</bar1>
<bar2 id="2">
<someValue2>11</someValue2>
</bar2>
<bar3 id="3">
<el1>Bar3 el1</el1>
<el2>
<someValue1>5</someValue1>
<someValue3>8</someValue3>
</el2>
</bar3>
</foo>
</root>
我已经能够创建一个接近但是bar3 / el2元素出现两次的xslt文件。当然,我可以更深入1级,但不应限制bar3(或任何其他元素)的子元素的嵌套。这是我到目前为止尝试的xlst:
<xsl:variable name="supplement" select="document('file2.xml')" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="foo//*[@id]" >
<xsl:variable name="sup-element" select="$supplement//*[@id=current()/@id]"/>
<xsl:choose>
<xsl:when test="$sup-element">
<xsl:element name="{name()}" >
<xsl:apply-templates select="$sup-element/@*"/>
<xsl:apply-templates select="./*|$sup-element/*"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我找到了一些使用嵌套合并元素的例子,但由于我对xslt的经验不多,我可以使用一些帮助。