2013-01-02 49 views
2

我想了解如何使用我已經編寫的代碼推導出解決方案。XSLT Group/merge childs(使用密鑰)

爲了簡化,我將首先解釋我想要做什麼以及我到目前爲止所做的。

假設我在XSLT中包含少數具有相同標題屬性的節點的XML變量。我使用@Dimitre Novatchev solution我設法將它們組合成一個節點。

所以,如果我有:

<t> 
    <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="xxx" Key="4" Temp="yyy"> 
     <ItemData ID="www" Value="1982"/> 
    </GroupData> 
    <GroupData ID="yyy" Key="4" Temp="yyy"> 
     <ItemData ID="def" Value="1982"/> 
    </GroupData> 
    <GroupData ID="zzz" Temp="yyy"> 
     <ItemData ID="tuv" Value="1982"/> 
    </GroupData> 
</t> 

使用後,以下關鍵

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID, '+', @Key)"/> 

我會得到:

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

現在我想改變這一個有點,我希望能夠通過我的決定合併/合併標題。考慮到這一點,在上面的例子中,我想定義xxx和zzz在同一個組中,儘管它們使用的是不同的標題(極端情況 - 在我的工作空間中,我將它們定義爲相同的 - 我可能會有更多情況這個)。如果你能告訴我通常應該做的方向是什麼(我想我需要修改我的密鑰或使用替代方法 - 生成id或其他方法),我將不勝感激。

我發現自己只實施需要大量不必要努力的不良解決方案。

回答

0

我想這是XSLT1這是一種恥辱,因爲它看起來在XSLT2更好,但無論如何,你基本上需要確保要組節點一起使用相同的密鑰

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID, '+', @Key)"/> 

事情結束只有得到相同的使用屬性,如果它們具有相同的@ID和@key

如果更改到

<xsl:key name="kGDByIdKey" match="GroupData[not(@ID='xxx')]" use="concat(@ID, '+', @Key)"/> 
<xsl:key name="kGDByIdKey" match="GroupData[@ID='xxx'] use="concat('zzz', '+', @Key)"/> 

然後用ID xxx節點將被編入索引(並因此編組)zzz(或者當您從節點構建查找值時,您需要做出類似的更改)

如果您使用xslt 2您可以使用更簡單的功能樣式,當擴展到多個這樣的變化時,不可運行

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(replace(@ID,'^xxx$','zzz'), '+', @Key)"/>