在 xslt 中分组 table

Grouping in xslt table

我正在将 xml 转换为 xslt,但在对 table 中的相同值进行分组时卡住了。转换成功但我需要的是,如果 ProductName 相同或 ItemNumber 相同,那么我不想在 table 中创建 header。我正在尝试使用该变量来确定该项目是否得到处理但我认为我在语法中遗漏了一些东西。这是代码。

XML

<?xml version="1.0"?>
<Items>
      <Item ItemNumber="1151464">
        <ProductName>Spritz Grape Seat and Extra Seat</ProductName>
        <ProviderName>Bambeano</ProviderName>
        <Quantity>1</Quantity>
        <Price>56.99</Price>
      </Item>
      <Item ItemNumber="1150173">
        <ProductName>Lucille Tan</ProductName>
        <ProviderName>Boston Babes</ProviderName>
        <Quantity>1</Quantity>
        <Price>24.99</Price>
      </Item>
      <Item ItemNumber="1151464">
        <ProductName>Spritz Grape Seat and Extra Seat</ProductName>
        <ProviderName>Bambeano</ProviderName>
        <Quantity>1</Quantity>
        <Price>56.99</Price>
      </Item>
      <Item ItemNumber="1151464">
        <ProductName>Spritz Grape Seat and Extra Seat</ProductName>
        <ProviderName>Bambeano</ProviderName>
        <Quantity>20</Quantity>
        <Price>56.99</Price>
      </Item>
      <Item ItemNumber="1151464">
        <ProductName>Spritz Grape Seat and Extra Seat</ProductName>
        <ProviderName>Bambeano</ProviderName>
        <Quantity>1</Quantity>
        <Price>56.99</Price>
      </Item>
      <Item ItemNumber="1251464">
        <ProductName>Apple Pattern T-Shirt-Blue</ProductName>
        <ProviderName>Avahna</ProviderName>
        <Quantity>1</Quantity>
        <Price>14.99</Price>
      </Item>
</Items>

在上面的代码中,我多次使用 ProductName“Spritz Grape Seat and Extra Seat”。目前我的 xslt 单独打印它。我需要像下面的输出一样在组中。

以及最后所有项目的Grand-total。是否有任何元素可以确定它是数组的最后一个索引或 xml ?以便我将它添加到临时变量中并对所有变量求和并最终显示它?

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
<h1>Sale amount by provider</h1>
    <xsl:for-each select="Items/Item" group-by="@ProductName"> // i tried this something like this
<xsl:sort select="ProductName"/>
    <table border="2" width = "500">
      <tr bgcolor="#9acd32">
        <td colspan="4">Provider: <xsl:value-of select="ProductName"/></td>
      </tr>
      <tr>
         <td>Item Number</td>
<td>Quantity</td>
<td>Unit Price</td>
<td>Total</td>
</tr>
<tr>
        <td><xsl:value-of select="@ItemNumber"/></td>
        <td><xsl:value-of select="Quantity"/></td>
        <td><xsl:value-of select="Price"/></td>
        <td><xsl:value-of select="Quantity * Price"/></td>
      </tr>
<tr>
<td colspan="3" align="right"><b>Sub-Total</b></td>
 <td><xsl:value-of select="Quantity * Price"/></td>
</tr>
    </xsl:for-each>
<h1>test</h1>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

我的 xslt 正在重现什么

需要合并成一个table

感谢帮助将不胜感激。

您已标记此 xslt-2.0,因此您可以在此处使用 xsl:for-each-group 进行分组。

 <xsl:for-each-group select="Items/Item" group-by="ProductName">

然后您将为每个 table 执行 header。然后,要获取每组的项目,您可以使用 current-group()

<xsl:for-each select="current-group()">

然后为组中的每个项目输出一行

试试这个 XSLT

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
  <h1>Sale amount by provider</h1>
  <xsl:for-each-group select="Items/Item" group-by="ProductName">
  <xsl:sort select="ProductName"/>
    <table border="2" width = "500">
      <tr bgcolor="#9acd32">
        <td colspan="4">Provider: <xsl:value-of select="ProductName"/></td>
      </tr>
      <tr>
         <td>Item Number</td>
        <td>Quantity</td>
        <td>Unit Price</td>
        <td>Total</td>
     </tr>
    <xsl:for-each select="current-group()">
     <tr>
        <td><xsl:value-of select="@ItemNumber"/></td>
        <td><xsl:value-of select="Quantity"/></td>
        <td><xsl:value-of select="Price"/></td>
        <td><xsl:value-of select="Quantity * Price"/></td>
      </tr>
    </xsl:for-each>
    <tr>
     <td colspan="3" align="right"><b>Sub-Total</b></td>
     <td><xsl:value-of select="sum(current-group()/(Quantity * Price))"/></td>
   </tr>
  </table>
</xsl:for-each-group>
</body>
</html>
</xsl:template>
</xsl:stylesheet>