分组并计入XSLT 2.0

时间:2014-01-11 15:34:31

标签: xslt xslt-2.0 xslt-grouping

我正在尝试制作一个按标签分组的计数表。 我想计算每个级别的“standings_level”在我的文件中的次数。

以下是我的XML文件的摘录:

<entries>
  <entry>
    <standings_levels>
      <standings_level>4</standings_level>
    </standings_levels>
  </entry>
  <entry>
    <standings_levels>
      <standings_level>3</standings_level>
    </standings_levels>
  </entry>
  ....
 </entries>

我在xsl 2.0中尝试使用for-each-group

<xsl:for-each-group select="entries/entry/standings_levels/standings_level" group-by=".">
    <tr>
        <td>
            <xsl:value-of select="current-grouping-key()"/>
        </td>
        <td>
            <xsl:value-of select="count(current-group())"/>
        </td>
    </tr>
</xsl:for-each-group>

但它没有返回任何东西,我做错了什么?

这是我的完整XSL文件。

<?xml version="1.0"?>

<xsl:stylesheet version="2.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:include href="../include/template.xsl" />

    <xsl:template match="/">
        <html lang="en">
            <xsl:call-template name="header" />
            <body>
                <xsl:call-template name="barreMenu" />
                <div id="wrap">
                    <div class="container">

                        <table class="table table-bordered table-hover table-striped" id="tableTest">
                            <thead>
                                <tr>
                                    <th>Label</th>
                                    <th>Count</th>
                                </tr>
                            </thead>
                            <tbody>
                                <xsl:for-each-group select="entries/entry/standings_levels/standings_level" group-by=".">
                                    <tr>
                                        <td>
                                            <xsl:value-of select="current-grouping-key()"/>
                                        </td>
                                        <td>
                                            <xsl:value-of select="count(current-group())"/>
                                        </td>
                                    </tr>
                                </xsl:for-each-group>
                            </tbody>
                        </table>

                    </div><!-- /.container -->
                </div>
                <xsl:call-template name="footer" />

            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

发布最小但完整的代码示例,以便我们重现问题。当我使用Saxon 9.5和样式表

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

    <!--<xsl:include href="../include/template.xsl" />-->
<xsl:output indent="yes"/>
    <xsl:template match="/">
        <html lang="en">
            <!--<xsl:call-template name="header" />-->
            <body>
                <!--<xsl:call-template name="barreMenu" />-->
                <div id="wrap">
                    <div class="container">

                        <table class="table table-bordered table-hover table-striped" id="tableTest">
                            <thead>
                                <tr>
                                    <th>Label</th>
                                    <th>Count</th>
                                </tr>
                            </thead>
                            <tbody>
                                <xsl:for-each-group select="entries/entry/standings_levels/standings_level" group-by=".">
                                    <tr>
                                        <td>
                                            <xsl:value-of select="current-grouping-key()"/>
                                        </td>
                                        <td>
                                            <xsl:value-of select="count(current-group())"/>
                                        </td>
                                    </tr>
                                </xsl:for-each-group>
                            </tbody>
                        </table>

                    </div><!-- /.container -->
                </div>
                <!--<xsl:call-template name="footer" />-->

            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

和输入

<entries>
  <entry>
    <standings_levels>
      <standings_level>4</standings_level>
    </standings_levels>
  </entry>
  <entry>
    <standings_levels>
      <standings_level>3</standings_level>
    </standings_levels>
  </entry>
  ....
 </entries>

我得到了结果

<html lang="en">
   <body>
      <div id="wrap">
         <div class="container">
            <table class="table table-bordered table-hover table-striped" id="tableTest">
               <thead>
                  <tr>
                     <th>Label</th>
                     <th>Count</th>
                  </tr>
               </thead>
               <tbody>
                  <tr>
                     <td>4</td>
                     <td>1</td>
                  </tr>
                  <tr>
                     <td>3</td>
                     <td>1</td>
                  </tr>
               </tbody>
            </table>
         </div>
      </div>
   </body>
</html>

所以问题是由不同的输入(注意xmlns="...")或不同的XSLT代码引起的,而不是由你发布的代码引起的。