1

我有 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 如何做到这一点?

4

1 回答 1

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 文档作为参数值传入 name replacements。上面的 XSLT 将保持不变。或者,如果值文件中,但可能在不同时间使用不同的文件,则可以改为将文件路径作为参数传入 name replacementFile。同样,上述 XSLT 不需要修改即可。

于 2013-01-25T18:43:21.617 回答