【问题标题】:XSTL 2.0 sub-total and total-sum given multiple rows给定多行的 XSLT 2.0 小计和总计
【发布时间】:2017-06-03 17:50:40
【问题描述】:

我目前正在学习一些 XSTL 2.0。我希望将 XML 文档转换为格式整齐的 HTML 文件。

我目前正在尝试做的是:

Group Suppliers, [sort them A-Z]
List their Items [sort them 1-n]
Calculate the QTY * Cost
Sum the cost of all orders from that supplier
Sum the total cost of all suppliers

输出应如下所示:

Supplier A
Item #  Qty Item Price  Total
1       5   5.50        27.50
3       10  5.50        55.00
Sub-total   $82.50
Supplier B
Item #  Qty Item Price  Total
2       10  10          100.00
Sub-total   $100.00
Total-cost  $182.50

我可以让所有排序和分组等按预期工作,但我不知道如何计算小计或总成本值,因为它们是计算出来的,而不是原始 XML 文档的一部分。我是否以某种方式存储计算的成本,以便在完成分组、排序、计算功能后对其求和?

这是我当前的 XML:

<?xml version="1.0"?>
<Orders>
    <Order OrderNo="1">
        <Supplier>Supplier A</Supplier>
        <Quantity>5</Quantity>
        <Price>5.50</Price>
    </Order>
    <Order OrderNo="2">
        <Supplier>Supplier B</Supplier>
        <Quantity>10</Quantity>
        <Price>10</Price>
    </Order>
    <Order OrderNo="3">
        <Supplier>Supplier A</Supplier>
        <Quantity>10</Quantity>
        <Price>5.50</Price>
    </Order

这是当前的 XSL 2.0 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <title></title>
            </head>
            <body>
                <p>
                </p>
                <xsl:for-each-group select="Orders/Order"
                    group-by="Supplier">
                    <xsl:sort select="Supplier" data-type="text" order="ascending" />
                    <xsl:for-each-group select="current-group()"
                        group-by="@OrderNo">
                        <xsl:sort select="@OrderNo" data-type="number" order="ascending" />
                    </xsl:for-each-group>
                    <table>
                        <tr>
                            <td colspan="4">
                                <xsl:value-of select="Supplier" />
                            </td>
                        </tr>
                        <tr>
                            <td>Item #</td>
                            <td>Qty</td>
                            <td>Item Price</td>
                            <td>Total</td>
                        </tr>

                        <xsl:for-each select="current-group()">
                            <xsl:sort select="@OrderNo" data-type="number" order="ascending" />
                            <tr>
                                <td>
                                    <xsl:value-of select="@OrderNo" />
                                </td>
                                <td>
                                    <xsl:value-of select="Quantity" />
                                </td>
                                <td>
                                    <xsl:value-of select="Price" />
                                </td>
                                <td>
                                    <xsl:value-of select="format-number(Quantity * Price,'0.00')" />
                                </td>
                            </tr>
                        </xsl:for-each>
                        <tr>
                            <td class="Sub-total" colspan="3">Sub-total</td>
                            <td></td>
                        </tr>
                    </table>
                </xsl:for-each-group>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

这是生成的 HTML 输出:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title></title>
   </head>
   <body>
      <p></p>
      <table>
         <tr>
            <td colspan="4">Supplier A</td>
         </tr>
         <tr>
            <td>Item #</td>
            <td>Qty</td>
            <td>Item Price</td>
            <td>Total</td>
         </tr>
         <tr>
            <td>1</td>
            <td>5</td>
            <td>5.50</td>
            <td>27.50</td>
         </tr>
         <tr>
            <td>3</td>
            <td>10</td>
            <td>5.50</td>
            <td>55.00</td>
         </tr>
         <tr>
            <td class="Sub-total" colspan="3">Sub-total</td>
            <td></td>
         </tr>
      </table>
      <table>
         <tr>
            <td colspan="4">Supplier B</td>
         </tr>
         <tr>
            <td>Item #</td>
            <td>Qty</td>
            <td>Item Price</td>
            <td>Total</td>
         </tr>
         <tr>
            <td>2</td>
            <td>10</td>
            <td>10</td>
            <td>100.00</td>
         </tr>
         <tr>
            <td class="Sub-total" colspan="3">Sub-total</td>
            <td></td>
         </tr>
      </table>
   </body>
</html>

感谢您的长时间阅读!只需要破解总和部分。

亲切的问候

【问题讨论】:

    标签: xml eclipse xslt xslt-2.0


    【解决方案1】:

    在 XSLT 2.0 中,您可以这样做:

    <xsl:value-of select="format-number(sum(current-group()/(Quantity * Price)),'0.00')" />
    

    获取Orders的当前组的小计。

    【讨论】:

    • 非常好的计算方法加上current-group(),加一。
    • 哦,我想我把它高度复杂化了!感谢您的快速响应和准确的解决方案!是否也可以(使用我的 XLST)来计算整体,例如所有供应商的总成本?即供应商 A 总计 + 供应商 B 总计?我是否在 for-each 循环之外创建 SUM(current-group())?
    • 抱歉忘记标记你@michael.hor257k(新加入)
    • 要获得总计,请使用:xsl:value-of select="format-number(sum(/Orders/Order/(Quantity * Price)),'0.00')" /&gt;。这使用了一个绝对路径,因此它可以在任何地方工作——尽管它应该在任何xsl:for-each-group 之外使用(因此,在任何table 之外)。
    【解决方案2】:

    对当前的 Order 节点组求和:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
            <html>
                <head>
                    <title></title>
                </head>
                <body>
                    <p>
                    </p>
                    <xsl:for-each-group select="Orders/Order" group-by="Supplier">
                        <xsl:sort select="Supplier" data-type="text" order="ascending" />
    
                        <table>
                            <tr>
                                <td colspan="4">
                                    <xsl:value-of select="Supplier" />
                                </td>
                            </tr>
                            <tr>
                                <td>Item #</td>
                                <td>Qty</td>
                                <td>Item Price</td>
                                <td>Total</td>
                            </tr>
                            <xsl:for-each select="current-group()">
                                <xsl:sort select="@OrderNo" data-type="number" order="ascending" />
                                <tr>
                                    <td>
                                        <xsl:value-of select="@OrderNo" />
                                    </td>
                                    <td>
                                        <xsl:value-of select="Quantity" />
                                    </td>
                                    <td>
                                        <xsl:value-of select="Price" />
                                    </td>
                                    <td>
                                        <xsl:value-of select="format-number(Quantity*Price,'0.00')" />
                                    </td>
                                </tr>
                            </xsl:for-each>
                            <tr>
                                <td class="Sub-total" colspan="3">Sub-total</td>
                                <td>
                                    <xsl:value-of select="format-number(sum(current-group()/(Quantity*Price)),'0.00')"/>
                                </td>
                            </tr>
                        </table>
                    </xsl:for-each-group>
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • @michael.hor257k 抱歉。我在编辑 OP 的 XSLT 时没有注意到已发布答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2012-10-03
    相关资源
    最近更新 更多