0

我一直在为特定的 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>
4

2 回答 2

1

干得好。

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

无论如何,我在您的解决方案顶部添加了一个名为 key_t-code 的密钥,然后在解决方案中多次使用它。这里的技巧是当迭代 for-each 循环只做某事时,在你的情况下,当你第一次遇到循环时对节点进行求和,通过使用 key 和 generate-id 来实现。说够了。一个例子值一千字。给你...哦,我确实必须更正你的 XSLT na 几个地方。大多数情况下,您的上下文在这里和那里都不存在。

<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>
于 2013-10-11T05:55:26.277 回答
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 浏览器中,它应该会对其进行转换。

于 2013-10-12T06:12:37.970 回答