【问题标题】:How to merge two XML files如何合并两个 XML 文件
【发布时间】:2013-03-02 13:57:10
【问题描述】:

我有两个xml文件,需要合并成一个xml。这是一个例子:

原始.xml文件:

<employees>
  <employee id="1">
    <name> Name1 </name>
    <email> email1 <email>
  </employee>
  <employee id="2">
    <name> Name2 </name>
    <email> email2 <email>
  </employee>
</employees>

update.xml 文件:

<employees>
        <employee id="2">
            <name> Name2 </name>
            <email> email_New <email>
        </employee>
        <employee id="3">
            <name> Name3 </name>
            <email> email3 <email>
        </employee>
</employees>

它们应该像这样合并到一个 xml 文件中:

<employees>
  <employee id="1">
    <name> Name1 </name>
    <email> email1 <email>
  </employee>  
  <employee id="2">
    <name> Name2 </name>
    <email> email_New <email>
  </employee>
  <employee id="3">
    <name> Name3 </name>
    <email> email3 <email>
  </employee>
</employees>

其实我想用 update.xml 来更新 orginal.xml :

  1. update.xml 中的新员工应添加到 original.xml

  2. update.xml中修改的员工信息应该会覆盖对应的员工节点。

我对 XSLT 了解一点,但我的知识不足以找出适合合并的 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="fileName" select="'update.xml'" />
      <xsl:param name="updates" select="document($fileName)" />
    
      <xsl:variable name="updateEmployees" select="$updates/employees/employee" />
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="employees">
        <xsl:copy>
          <xsl:apply-templates select="employee[not(@id = $updateEmployees/@id)]" />
          <xsl:apply-templates select="$updateEmployees" />
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    当使用您的第一个 XML 作为输入并且 update.xml 存在于同一文件夹中运行时,这会产生:

    <employees>
      <employee id="1">
        <name> Name1 </name>
        <email>
          email1 </email>
      </employee>
      <employee id="2">
        <name> Name2 </name>
        <email>
          email_New
        </email>
      </employee>
      <employee id="3">
        <name> Name3 </name>
        <email>
          email3
        </email>
      </employee>
    </employees>
    

    fileNameupdates 被声明为参数,因此如果更新位于名为“update.xml”以外的文件中,或者您想直接传递更新 XML,则无需进行任何操作即可对 XSLT 的修改。

    【讨论】:

    • 谢谢 Rishe,我会试试的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多