当匹配'id'属性时,我想使用XSLT合并2个XML文件。
myFile1.xml(这是第一个输入文件)
<?xml version="1.0" encoding="ISO-8859-1"?>
<test>
<node>
<type id="a">
<name>joe</name>
<name>kill</name>
</type>
</node>
<node>
<type id="b">
<name>sam</name>
</type>
</node>
</test>
myFile2.xml(这是第二个输入文件)
<?xml version="1.0" encoding="ISO-8859-1"?>
<test>
<node>
<type id="a">
<name>jill</name>
<name>kill</name>
</type>
</node>
</test>
mergeOutput.xml(这是预期的输出,其中id匹配,2个文件合并)
<?xml version="1.0" encoding="ISO-8859-1"?>
<test>
<node>
<type id="a">
<name>joe</name>
<name>jill</name>
<name>Kill</name>
</type>
</node>
<node>
<type id="b">
<name>sam</name>
</type>
</node>
</test>
任何XSLT代码或代码链接都会有所帮助。我没有XSLT知识并且使用这个合并来使事情有效。
答案 0 :(得分:0)
XSLT 2.0解决方案:
<xsl:template name="main">
<test>
<node>
<xsl:for-each-group select="(doc('myFile1.xml'), doc('myFile2.xml'))/test/node/type"
group-by="@id">
<type id="{@id}">
<xsl:copy-of select="current-group()/*"/>
</type>
</xsl:for-each-group>
</node>
</test>
</xsl:template>
答案 1 :(得分:0)
您可以在LINQ2XML
XElement doc1=XElement.Load("myFile1.xml");
XElement doc2=XElement.Load("myFile2.xml");
XElement doc3=XElement.Load("myFile1.xml");//will contain mergeOutput
var dec=doc3.Descendants().Elements("type").ToList();
int i=0;
foreach(XElement elm1 in doc1.Descendants().Elements("type"))
foreach(XElement elm2 in doc2.Descendants().Elements("type"))
if(elm1.Attribute("id").Value==elm2.Attribute("id").Value)
dec[i++].Add(elm2.Elements());
doc3;//your mergeOutput
答案 2 :(得分:0)
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" />
<xsl:variable name="with" select="'myFile2.xml'" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="//type">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
<xsl:variable name="info" select="document($with)/test/node/type[@id=current()/@id]/." />
<xsl:for-each select="$info/*">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:transform>
此转换的输出是(请参阅kill是重复的) -
<?xml version="1.0" encoding="ISO-8859-1"?>
<test>
<node>
<type id="a">
<name>joe</name>
<name>kill</name>
<name>jill</name>
<name>kill</name>
</type>
</node>
<node>
<type id="b">
<name>sam</name>
</type>
</node>
</test>