合并XML文档一起覆盖某些元素

时间:2013-01-25 18:22:52

标签: xml xslt

我有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完成此操作?

1 个答案:

答案 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不需要修改就可以了。