XSLT,XML:按属性值分组

问题描述:

使用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 \t \t \t的 \t \t的xsl:for-各个群组> XSL:模板> \t \t的 \t \t \t \t \t \t \t \t XSL:模板> XSL:样式> 结果XML只包含根元素。 非常感谢您的帮助。 Thomas transaction> – ThomasMuller

在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