如何合并两个XML文件(How to merge two XML files)

2019-07-20 20:50发布

我有两个XML文件,需要被合并到一个XML。 这里是例子:

orginal.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。

Answer 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。



文章来源: How to merge two XML files
标签: xml xslt