使用XSL对SQL元素进行分组

时间:2013-10-10 21:20:04

标签: sql xslt

我一直在为特定的SQL查询表编写一个XSL样式表。我想通过'tcode'对结果进行分组,并将每个数字列的值相加。任何帮助将不胜感激。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="h_ind h_year h_code" />

<xsl:variable name="v_warning"  select="CustomDeferredReport/title/ds_type" />

<xsl:template match="/">

<HTML>
  <BODY>

    <TABLE>
      <TR valign="top">
        <TD style="color:black; font-family: arial; font-size: 14pt; font-weight: bold" width="800">
          <xsl:choose>
            <xsl:when test="$v_warning = '1'">
              <xsl:value-of select="CustomDeferredReport/title/rpt_title" />
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="CustomDeferredReport/title/rpt_warning" />
            </xsl:otherwise>
          </xsl:choose>
        </TD>
      </TR>
    </TABLE>

    <xsl:choose>
      <xsl:when test="$v_warning = 1">
        <TABLE>
          <TR style="text-decoration: underline; font-family: arial; font-size: 8pt; font-weight: bold">
            <BOLD>
              <TD width="100">Code</TD>
              <TD width="200">Name</TD>
              <TD width="100">Beginning Balance</TD>
              <TD width="100">Current Activity</TD>
              <TD width="100">Other Activity</TD>
              <TD width="100">Balance Sheet Only Activity</TD>
              <TD width="100">Ending Balance</TD>
            </BOLD>
          </TR>

          <xsl:for-each select='/CustomDeferredReport/temps'>
            <TR style="font-family: arial; font-size: 8pt">
              <TD><xsl:value-of select='tcode'/></TD>
              <TD><xsl:value-of select='tname'/></TD>
              <TD align="right"><xsl:value-of select='tbbal'/></TD>
              <TD align="right"><xsl:value-of select='tdiff'/></TD>
              <TD align="right"><xsl:value-of select='tothd'/></TD>
              <TD align="right"><xsl:value-of select='tbsd'/></TD>
              <TD align="right"><xsl:value-of select='tebal'/></TD>
            </TR>
          </xsl:for-each>
        </TABLE>
      </xsl:when>
      <xsl:otherwise>
      </xsl:otherwise>
     </xsl:choose>

  </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

你走了。

在XSLT中,您可以使用一种非常常见的分组技术,它涉及一个键和generate-id()函数,它被称为muenchian分组(Google it)。

无论如何,我在解决方案的顶部添加了一个名为key_t-code的密钥,然后在解决方案中多次使用它。这里的技巧是在for-each循环上进行迭代时只做一些事情,在你的情况下,当你第一次遇到循环时对节点求和,通过使用key和generate-id实现。说够了。一个例子胜过千言万语。在这里你去...哦,我确实需要在几个地方纠正你的XSLT。大多数情况下你的背景都不在这里。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:strip-space elements="h_ind h_year h_code" />

    <xsl:key name="key_t-code" match="temps" use="tcode"/>

    <xsl:variable name="v_warning"  select="/CustomDeferredReport/title/ds_type" />

    <xsl:template match="/">

        <HTML>
            <BODY>

                <TABLE>
                    <TR valign="top">
                        <TD style="color:black; font-family: arial; font-size: 14pt; font-weight: bold" width="800">
                            <xsl:choose>
                                <xsl:when test="$v_warning = '1'">
                                    <xsl:value-of select="CustomDeferredReport/title/rpt_title" />
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="CustomDeferredReport/title/rpt_warning" />
                                </xsl:otherwise>
                            </xsl:choose>
                        </TD>
                    </TR>
                </TABLE>

                <xsl:choose>
                    <xsl:when test="$v_warning = 1">
                        <TABLE>
                            <TR style="text-decoration: underline; font-family: arial; font-size: 8pt; font-weight: bold">
                                <BOLD>
                                    <TD width="100">Code</TD>
                                    <TD width="200">Name</TD>
                                    <TD width="100">Beginning Balance</TD>
                                    <TD width="100">Current Activity</TD>
                                    <TD width="100">Other Activity</TD>
                                    <TD width="100">Balance Sheet Only Activity</TD>
                                    <TD width="100">Ending Balance</TD>
                                </BOLD>
                            </TR>

                            <xsl:for-each select='CustomDeferredReport/temps'>
                                <xsl:if test="generate-id(key('key_t-code', tcode)[1]) = generate-id(.)">
                                <TR style="font-family: arial; font-size: 8pt">
                                    <TD><xsl:value-of select='tcode'/></TD>
                                    <TD><xsl:value-of select='tname'/></TD>
                                    <TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tbbal)"/></TD>
                                    <TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tdiff)"/></TD>
                                    <TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tothd)"/></TD>
                                    <TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tbsd)"/></TD>
                                    <TD align="right"><xsl:value-of select="sum(key('key_t-code', tcode)/tebal)"/></TD>
                                </TR>
                                </xsl:if>
                            </xsl:for-each>
                        </TABLE>
                    </xsl:when>
                    <xsl:otherwise>
                    </xsl:otherwise>
                </xsl:choose>

            </BODY>
        </HTML>
    </xsl:template>
</xsl:stylesheet>

和Xml

<?xml version="1.0" encoding="UTF-8"?>
<CustomDeferredReport>
    <title>
        <ds_type>1</ds_type>
        <rpt_title>some title rpt_title</rpt_title>
        <rpt_warning>some title rpt_warning</rpt_warning>
    </title>
    <temps>
        <tcode>AAA</tcode>
        <tname>Tripel A</tname>
        <tbbal>9.99</tbbal>
        <tdiff>.24</tdiff>
        <tothd>23</tothd>
        <tbsd>5.00</tbsd>
        <tebal>62</tebal>
    </temps>
    <temps>
        <tcode>AAA</tcode>
        <tname>Tripel A</tname>
        <tbbal>3.99</tbbal>
        <tdiff>1.24</tdiff>
        <tothd>2.03</tothd>
        <tbsd>50.00</tbsd>
        <tebal>63.23</tebal>
    </temps>
    <temps>
        <tcode>AAA</tcode>
        <tname>Tripel A</tname>
        <tbbal>.99</tbbal>
        <tdiff>24</tdiff>
        <tothd>2.3</tothd>
        <tbsd>500</tbsd>
        <tebal>65.23</tebal>
    </temps>
    <temps>
        <tcode>BB</tcode>
        <tname>Double B</tname>
        <tbbal>2</tbbal>
        <tdiff>.24</tdiff>
        <tothd>23</tothd>
        <tbsd>5.00</tbsd>
        <tebal>62</tebal>
    </temps>
    <temps>
        <tcode>BB</tcode>
        <tname>Double B</tname>
        <tbbal>4</tbbal>
        <tdiff>11.24</tdiff>
        <tothd>28.03</tothd>
        <tbsd>5.23</tbsd>
        <tebal>.26</tebal>
    </temps>
    <temps>
        <tcode>BB</tcode>
        <tname>Double A</tname>
        <tbbal>6</tbbal>
        <tdiff>32</tdiff>
        <tothd>223</tothd>
        <tbsd>6.7</tbsd>
        <tebal>12.23</tebal>
    </temps>

</CustomDeferredReport>

答案 1 :(得分:0)

要将此解决方案与您的环境分开运行,以便在本地浏览器中查看此操作,只需在Xml中的现有xml声明下方添加以下减速(为了安全起见,请使用我的Xml)。

<?xml-stylesheet type='text/xsl' href='tcode.xsl'?>

使用我编写的XSLT并将其保存到磁盘并将其命名为tcode.xsl。这种转换应该在IE中运行lickity split,但如果你坚持在Chrome中运行它,你必须设置一个标志,使本地文件能够运行... - allow-file-access-from-files

将xml-stylesheet减速度添加到Xml后,将Xml拖到IE浏览器中,它应该对其进行转换。