代码之家  ›  专栏  ›  技术社区  ›  Ben

XSTL 2.0给定多行的小计和总和

  •  1
  • Ben  · 技术社区  · 9 年前

    我目前正在学习一些XSTL2.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>
    

    感谢您的长篇阅读!只需破解求和部分。

    亲切问候

    2 回复  |  直到 9 年前
        1
  •  2
  •   michael.hor257k    9 年前

    在XSLT 2.0中,您可以简单地执行以下操作:

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

    要获取当前组的小计,请执行以下操作: Order s

        2
  •  1
  •   Madeyedexter    9 年前

    在当前订单节点组上多个并应用求和:

    <?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>