我有2个输入xml文件。模板xml文件,例如
<test>
<a>0</a>
<b>0</b>
<c>0</c>
<d>0</d>
<e>0</e>
</test>
和一个数据xml文件,指定覆盖模板xml中的值的值。数据xml文件可能未指定模板xml中所有元素的值,例如
<test>
<a>1</a>
<b>2</b>
<c>3</c>
</test>
或
<test>
<e>5</e>
</test>
最终的xml应该是数据xml与模板xml的叠加。例如
<test>
<a>1</a>
<b>2</b>
<c>3</c>
<d>0</d>
<e>0</e>
</test>
或
<test>
<a>0</a>
<b>0</b>
<c>0</c>
<d>0</d>
<e>5</e>
</test>
如何使用XSLT完成此操作?
答案 0 :(得分:0)
就像你在那里只有一个深度,这应该有效:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="replacementFile" select="'replacements.xml'" />
<xsl:param name="replacements" select="document($replacementFile)" />
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*">
<xsl:variable name="replacement"
select="$replacements/*/*[local-name() = local-name(current())]" />
<xsl:copy>
<xsl:value-of select="$replacement | current()[not($replacement)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将第一个XML代码段作为输入文档,将第二个代码段保存为replacements.xml,输出为:
<test>
<a>1</a>
<b>2</b>
<c>3</c>
<d>0</d>
<e>0</e>
</test>
如果替换未存储在文件中,您可以将替换XML文档作为参数值传递,名称为replacements
。上面的XSLT将保持不变。或者,如果文件中的值 ,但可能在不同时间使用不同的文件,则可以将文件路径作为名称为replacementFile
的参数传递。同样,上面的XSLT不需要修改就可以了。