2015-07-03 96 views
2

我有两个文件,其中包含单独收集的相关信息。当每个处理器完成以相同格式收集xml数据时,如何使用XSLT合并这两个xml文件?如何合并两个XML文档和XSLT(可以是XSLT 2.0)?

例如:

AllSets_Names.xml

<Sets> 
    <Set id="1"> 
     <SetName>World Champ Decks 1999</SetName> 
    </Set> 
    <Set id="2"> 
     <SetName>World Champ Decks 1999</SetName> 
    </Set> 
    <Set id="3"> 
     <SetName>World Champ Decks 1999</SetName> 
    </Set> 
    <Set id="4"> 
     <SetName>World Champ Decks 1999</SetName> 
    </Set> 
    <Set id="5"> 
     <SetName>World Champ Decks 1999</SetName> 
    </Set> 
</Sets> 

AllSets_ShortNames.xml

<Sets> 
    <Set id="1"> 
     <SetShortName>W99</SetShortName> 
    </Set> 
    <Set id="2"> 
     <SetShortName>W00</SetShortName> 
    </Set> 
    <Set id="3"> 
     <SetShortName/> 
    </Set> 
    <Set id="4"> 
     <SetShortName>WD2</SetShortName> 
    </Set> 
    <Set id="5"> 
     <SetShortName>WD3</SetShortName> 
    </Set> 
</Sets> 

所需的输出:AllSets_NamesAndShortNames.xml

<Sets> 
    <Set id="1"> 
     <SetName>World Champ Decks 1999</SetName> 
     <SetShortName>W99</SetShortName> 
    </Set> 
    <Set id="2"> 
     <SetName>World Champ Decks 1999</SetName> 
     <SetShortName>W00</SetShortName> 
    </Set> 
    <Set id="3"> 
     <SetName>World Champ Decks 1999</SetName> 
     <SetShortName/> 
    </Set> 
    <Set id="4"> 
     <SetName>World Champ Decks 1999</SetName> 
     <SetShortName>WD2</SetShortName> 
    </Set> 
    <Set id="5"> 
     <SetName>World Champ Decks 1999</SetName> 
     <SetShortName>WD3</SetShortName> 
    </Set> 
</Sets> 
+0

是否必须是XSLT?我想我知道我会如何在Perl中做到这一点。 – Sobrique

+0

是的,它必须是我的XSLT。 –

回答

1

你可以这样来做:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="short-names-path" select="'AllSets_ShortNames.xml'"/> 
<xsl:key name="set-by-id" match="Set" use="@id" /> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Set"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:copy-of select="key('set-by-id', @id, document($short-names-path))/SetShortName"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

这是假设你正在处理的文件AllSets_Names.xml并传递路径AllSets_ShortNames.xml作为参数。

+0

美丽!你真了不起! –

2

一个好办法做到这一点是使用分组:

<xsl:template name="main"> 
    <Sets> 
    <xsl:for-each-group 
     select="document(('Names.xml','ShortNames.xml'))/Sets/Set" 
     group-by="@id"> 
     <Set> 
     <xsl:copy-of select="current-group()/(@*, *)"/> 
     </Set> 
    </xsl:for-each-group> 
</Sets> 
</xsl:template>