XSLT преобразование группы по элементу - PullRequest
0 голосов
/ 01 ноября 2018

Привет всем, я пытаюсь выучить 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 голосов
/ 01 ноября 2018

Вы не очень четко сказали, какой выход вы хотите, и вы не очень ясно сказали, какой выход вы получаете. Вы также не сказали нам, как вы выполняете преобразование (какой XSLT-процессор и как он вызывается).

Код написан правильно. Немного странно, что вы группируете, а затем не производите никакого вывода, который делает сгруппированную структуру видимой, но, возможно, это то, что вам нужно.

Вы говорите, что получаете сообщение об ошибке. Вы только сообщили нам о сводном сообщении, в котором говорится, что оно не удалось: где-то будут подробные сообщения, в которых сообщается, почему это не удалось. Если вы не видите эти сообщения, вам нужно сообщить нам, какой процессор вы используете и как, чтобы мы могли сообщить вам, где их найти.

Распространенной ошибкой считается, что вы используете процессор XSLT 2.0, когда у вас его нет. Некоторые люди думают, что все, что вам нужно сделать, это поместить "version = '2.0'" в начало таблицы стилей. Но если вы отправите таблицу стилей с надписью "version = '2.0'" процессору, который был написан в 2001 году и понимает только 1.0, он не будет обращать на это никакого внимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...