【问题标题】:Merge XML documents together overwriting certain elements将 XML 文档合并在一起,覆盖某些元素
【发布时间】:2013-01-26 02:43:21
【问题描述】:

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

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    对于像你那样的深度级别,这应该可以工作:

    <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 sn-p 作为输入文档,并将第二个 sn-p 保存为 replacements.xml,输出为:

    <test>
      <a>1</a>
      <b>2</b>
      <c>3</c>
      <d>0</d>
      <e>0</e>
    </test>
    

    如果替换未存储在文件中,您可以改为将替换 XML 文档作为参数值传入,名称为 replacements。上面的 XSLT 将保持不变。或者,如果文件中的值是,但可能在不同时间使用不同的文件,则可以改为将文件路径作为参数传递给名称replacementFile。同样,上述 XSLT 不需要修改即可。

    【讨论】:

    • 对于深度超过 1 级的 XML 是否可以使用通用解决方案?
    • 是的,但肯定有一些限制(例如不允许同名的兄弟姐妹)。您能否提供一个您想要合并的多级 XML 示例?
    • 实际上,要合并的 XML 文档对是多种多样的,并且根据文档的不同,某些元素可能会在不同级别重复。我想知道是否可以使用 xpath 值而不是 local-name 来进行文档间匹配。其次,哪个会更好地实现,XSLT 还是专用程序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多