[英]How do I merge two XML docs with XSLT (can be XSLT 2.0)?
我有两个文件,分别包含相关信息。 当每个处理器完成以相同格式收集xml数据时,如何使用XSLT合并两个xml文件?
例如:
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>
一个很好的方法是使用分组:
<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>
您可以这样进行:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.