我有两个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.
请尝试一下:
<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进行任何修改的情况下执行此操作.