我有两个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:
update.xml中的新员工应添加到original.xml
update.xml中修改后的员工信息应覆盖相应的员工节点。
我知道一点XSLT,但我的知识还不足以找出合并的正确XSLT。
答案 0 :(得分:2)
请试一试:
<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>
fileName
和updates
被声明为参数,因此如果更新位于名为“update.xml”以外的文件中,或者您希望直接传递更新XML,则可以执行此操作没有对XSLT进行任何修改。