代码之家  ›  专栏  ›  技术社区  ›  kzh

使用xslt进行总和和类别分组

  •  0
  • kzh  · 技术社区  · 14 年前

    对于XSLT,如何更改以下内容:

    <root>
      <element id="1" State="Texas" County="Dallas" Population="2412827" />
      <element id="2" State="Texas" County="Harris" Population="3984349" />
      <element id="3" state="Georgia" County="Fulton" Population="1014932" />
      <element id="4" state="Georgia" County="Richmond" Population="212775" />
    </root>
    

    进入:

    <body>
      <h2>Texas</h2>
      <table>
        <tr><td>Dallas</td><td>2412827</td></tr>
        <tr><td>Harris</td><td>3984349</td></tr>
        <tr><td>Total</td><td>6397176</td></tr>
      <h2>Georgia</h2>
      <table>
        <tr><td>Fulton</td><td>1014932</td></tr>
        <tr><td>Richmond</td><td>212775</td></tr>
        <tr><td>Total</td><td>1227707</td></tr>
      </table>
    </body>
    

    因为如果波多黎各成为一个州的话,我会被搞砸的。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Lachlan Roche    14 年前

    XSLT 1
    定义一个键“状态”,从中我们可以轻松地选择给定状态名的所有状态。然后应用muenchian分组来查找输入中的唯一状态。

    然后变得简单。“element”模板将每个状态名称应用一次,并使用key()获取该状态的所有条目。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
        <xsl:output method="xml" indent="yes" />
    
        <xsl:key name="state" match="element" use="@State" />
    
        <xsl:template match="root">
            <body>
                <xsl:apply-templates select="element[generate-id(.)=generate-id(key('state',@State)[1])]"/>
            </body>
        </xsl:template>
    
        <xsl:template match="element">
            <h2><xsl:value-of select="@State" /></h2>
            <table>
                <xsl:for-each select="key('state',@State)">
                    <tr>
                        <td>
                            <xsl:value-of select="@County" />
                        </td>
                        <td>
                            <xsl:value-of select="@Population" />
                        </td>
                    </tr>
                </xsl:for-each>
    
                <tr>
                    <td>
                        <xsl:text>Total</xsl:text>
                    </td>
                    <td>
                        <xsl:value-of select="sum(key('state',@State)/@Population)"/>
                    </td>
                </tr>
    
            </table>
        </xsl:template>
    
    </xsl:stylesheet>
    

    XSLT 2

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
        <xsl:output method="xml" indent="yes" />
    
        <xsl:template match="root">
            <body>
                <xsl:for-each-group select="element" group-by="@State">
                    <h2><xsl:value-of select="@State" /></h2>
                    <table>
                        <xsl:for-each select="current-group()">
                            <tr>
                                <td>
                                    <xsl:value-of select="@County" />
                                </td>
                                <td>
                                    <xsl:value-of select="@Population" />
                                </td>
                            </tr>
                        </xsl:for-each>
                        <tr>
                            <td>
                                <xsl:text>Total</xsl:text>
                            </td>
                            <td>
                                <xsl:value-of select="format-number(sum(current-group()/@Population), '#########')"/>
                            </td>
                        </tr>
                    </table>
                </xsl:for-each-group>
            </body>
        </xsl:template>
    
    </xsl:stylesheet>