2017-10-11 118 views
1

使用XSLT根據屬性值對元素進行分組的最佳方式是什麼? 使用XSLT 2.0或更高版本會更好嗎?XSLT,XML:按屬性值分組

許多預先感謝您的幫助

托馬斯

原始XML


<transaction>  
    <record type="1" > 
    <field number="1" > 
     <item >223</item> 
    </field> 
    </record> 

    <record type="14" > 
    <field number="1" > 
     <item >777</item> 
    </field> 
    </record> 

    <record type="14" > 
    <field number="1" > 
     <item >555</item> 
    </field> 
    </record>  
</transaction> 

分組之後的結果:

<transaction> 
    <records type="1" > 
     <record type="1" > 
     <field number="1" > 
      <item >223</item> 
     </field> 
     </record> 
    </records> 

    <records type="14" > 
     <record type="14" > 
     <field number="1" > 
      <item >777</item> 
     </field> 
     </record> 

     <record type="14" > 
     <field number="1" > 
      <item >555</item> 
     </field> 
     </record> 
    </records> 
</transaction> 
+1

的答案是 「是」。如果您能夠使用XSLT 2.0,那麼使用它幾乎肯定會更好。在這種情況下,你可以使用'xsl:for-each-group'結構,這使得分組更容易。所以,在這種情況下,你會做'' –

+0

Hi Tim! 非常感謝您的快速回復。 我用下面的模板嘗試了: 的 \t \t <的xsl:for-各個羣組選擇= 「記錄」 按......分組= 「@類型」> \t \t \t的 \t \t \t \t的 \t \t \t \t \t \t \t \t 結果XML只包含根元素。 非常感謝您的幫助。 Thomas ThomasMuller

回答

0

在XSLT 2.0中,您可以使用xsl:for-each-group,但是如果您打算執行<xsl:for-each-group select="record" group-by="@type">,那麼您必須將該位置記錄在transaction記錄中。

此外,您將需要使用current-group獲取組中的所有record元素。

試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" indent="yes" /> 

<xsl:template match="transaction"> 
    <xsl:copy> 
     <xsl:for-each-group select="record" group-by="@type"> 
      <records type="{current-grouping-key()}" > 
       <xsl:apply-templates select="current-group()" /> 
      </records> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

Hi Tim,很棒的工作。非常感謝您的支持:-)最好的問候,托馬斯 – ThomasMuller

+0

您好,我添加了一個新的問題:https://stackoverflow.com/questions/46767754/xslt-xml-how-to-disentangle-grouped-blocks-進入扁平層次 任何建議將不勝感激。 在此先感謝 Thomas – ThomasMuller