在xslt表

时间:2016-02-19 19:41:33

标签: html xml xslt xslt-2.0 xslt-grouping

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

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单独打印它。我需要像以下输出一样在组中。

Output

以及最后所有项目的总计。是否有任何元素我通过它确定它是我的数组或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正在复制什么

Output

需要在单个表中合并

感谢帮助将得到赞赏。

1 个答案:

答案 0 :(得分:1)

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

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

然后,您将为每个表执行标头。然后,要获取每个组的项目,您可以使用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>