簡體   English   中英

如何將兩個XML文檔與XSLT(可以是XSLT 2.0)合並?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM