XSLT转换按元素分组

时间:2018-11-01 11:38:47

标签: xml xslt

您好,我尝试学习XSLT转换,但是我想按类别进行分组,计算记录的数量(属于该类别和字段总和)。

例如,我的xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<root>
    <row>
        <prid>1</prid>
        <product>Name 1</product>
        <category>Cat 1</category>
        <price>23</price>
        <qty>9</qty>
        <sum>44</sum>
    </row>
    <row>
        <prid>2</prid>
        <product>Name 2</product>
        <category>Cat 3</category>
        <price>10</price>
        <qty>2</qty>
        <sum>22</sum>
    </row>
</root>

我的xsl文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
        <html>
            <body>
                <table>
                    <tr>
                        <th style="text-align:left">Prid</th>
                        <th style="text-align:left">Product</th>
                        <th style="text-align:left">Category</th>
                        <th style="text-align:left">Price</th>
                        <th style="text-align:left">Qty</th>
                        <th style="text-align:left">Sum</th>
                    </tr>
                            <xsl:for-each-group select="/root/row" group-by="category">
                            <xsl:for-each select="current-group()">
                                    <tr>
                                        <td>
                                            <xsl:value-of select="prid" />
                                        </td>
                                        <td>
                                            <xsl:value-of select="product" />
                                        </td>
                                        <td>
                                            <xsl:value-of select="category" />
                                        </td>
                                        <td>
                                            <xsl:value-of select="price" />
                                        </td>
                                        <td>
                                            <xsl:value-of select="count(current-group())" />
                                        </td>
                                        <td>
                                            <xsl:value-of select="sum(current-group()/sum)" />
                                        </td>
                                    </tr>
                                </xsl:for-each>
                            </xsl:for-each-group>
                </table>
            </body>
        </html>
 </xsl:template>
</xsl:stylesheet>

如果有人可以帮助我解决我的问题并向我解释。谢谢

1 个答案:

答案 0 :(得分:1)

您没有非常清楚地说明所需的输出,也没有非常清楚地说明要获取的输出。您还没有告诉我们如何运行转换(XSLT处理器和调用方式)。

所写的代码正确。进行分组,然后不产生任何使分组结构可见的输出,这有点奇怪,但这也许正是您想要的。

您说您收到一条错误消息。您只告诉我们有关失败的摘要消息:在某处会有详细的消息告诉您失败的原因。如果您没有看到这些消息,则需要告诉我们您正在运行哪个处理器以及如何运行,因此我们可以告诉您在哪里可以找到它们。

以为您在不运行XSLT 2.0处理器时是一个常见错误。有人认为将“ version ='2.0'”放在样式表的顶部是您所要做的。但是,如果您将一个说“ version ='2.0'”的样式表发送给2001年编写的,仅能理解1.0的处理器,则它不会引起任何注意。