2013-05-17 89 views
0

我必須在我的XML文檔中對同一節點的子節點進行分組(合併)。 我也發現了類似的話題,我得到了一些示例代碼,但我的XML是更爲複雜和扭曲,我需要真正瞭解以下XSL代碼的語法邏輯:詳細闡述XSL代碼

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" /> 
    <xsl:template match="/"> 
    <Groups> 
     <!-- 
     Iterate over a node set containing just one GroupData element for 
     each combination of ID and Key 
     --> 
     <xsl:for-each select="/Groups/GroupData[count(. | key('group-data', concat(@ID, '___', @Key))[1]) = 1]"> 
     <GroupData> 
      <!-- Copy attributes from the "prototype" GroupData --> 
      <xsl:copy-of select="@*"/> 
      <!-- 
      Copy ItemData children from *all* GroupData elements with matching 
      ID/Key 
      --> 
      <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" /> 
     </GroupData> 
     </xsl:for-each> 
    </Groups> 
    </xsl:template> 
</xsl:stylesheet> 

的該XSL的樣本 XML代碼:

<GroupData ID="xxx" Key="4" Temp="yyy"> 
     <ItemData ID="zzz" Value="3"/> 
    </GroupData> 
    <GroupData ID="yyy" Key="4" Temp="yyy"> 
     <ItemData ID="abc" Value="3"/> 
    </GroupData> 
    <GroupData ID="zzz" Temp="yyy"> 
     <ItemData ID="pqr" Value="1982"/> 
    </GroupData> 
    <GroupData ID="zzz" Temp="yyy"> 
     <ItemData ID="tuv" Value="1982"/> 
    </GroupData> 

所以我想了解XSL代碼,這樣我就可以應用它了我的情況。

有人可以爲我詳細說明嗎?更確切地說,這些部件:

<xsl:key name="group-data" match="GroupData" use="concat(@ID, '___', @Key)" /> 

<xsl:for-each select="/Groups/GroupData[count(. | key('group-data', concat(@ID, '___', @Key))[1]) = 1]"> 
     <GroupData> 
      <!-- Copy attributes from the "prototype" GroupData --> 
      <xsl:copy-of select="@*"/> 
      <!-- 
      Copy ItemData children from *all* GroupData elements with matching 
      ID/Key 
      --> 
      <xsl:copy-of select="key('group-data', concat(@ID, '___', @Key))/ItemData" /> 
     </GroupData> 
     </xsl:for-each> 

回答

0

<xsl:key name=""/>文檔中創建XML節點的索引,使用指定的表達式查找鍵。這是爲了更容易找到類似的節點。在XSL 1.x中,這是分組節點的主要手段。 key(name, key)用於查詢此索引。

在你的情況

/Groups/GroupData[count(. | key('group-data', concat(@ID, '___', @Key))[1]) = 1] 

basicly意味着:找到略同於指定鍵索引的所有GroupData節點。這也可以寫成:

/Groups/GroupData[generate-id() = generate-id(key('group-data', concat(@ID, '___', @Key))[1])] 

generate-id()方法創建文檔中的任何節點的唯一ID。它可以比較節點的相等性。如果未提供參數,則使用主動節點(.