2013-05-06 10 views
2

У меня возникла проблема выбора отдельных значений для каждой группы. Результат просто не отображается на экране. Желаемый результат показан ниже:Выберите отдельное значение в XSLT для каждой группы

<xsl:for-each-group select="Items/Item" group-by="ProviderName"> 
    <xsl:sort select="current-grouping-key()"/> 
    <tr> 
     <th> 
      <xsl:value-of select="current-grouping-key()"/> 
     </th> 
    </tr> 
    <tr> 
     <td> 
      <xsl:text>Item Number</xsl:text> 
     </td> 
     <td> 
      <xsl:text>Quantity</xsl:text> 
     </td> 
     <td> 
      <xsl:text>Unit Price</xsl:text> 
     </td> 
     <td> 
      <xsl:text>Total</xsl:text> 
     </td> 
    </tr> 
    <xsl:apply-templates select="current-group()"/> 
</xsl:for-each-group> 

То, что я собираюсь сделать, это выбрать различные значения current-group() в apply-templates тег, который, как это

<xsl:template match="Item"> 
     <xsl:value-of select="distinct-values(./ItemName)"/> 
    </xsl:template> 

я прочитал несколько образцов на сеть и самый оптимальный способ сделать это - использовать функцию generate-id() с петлей for-each-group. Но я попытался и не получил положительного результата. Это источник XML:

<Items> 
    <Item ItemNumber="1148087"> 
     <ProductName>Dolby Metal-Black-Matte</ProductName> 
     <ProviderName>Vestal Watches</ProviderName> 
     <Quantity>4</Quantity> 
     <UnitPrice>67.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1150197"> 
     <ProductName>Vercilli Blk-Tan</ProductName> 
     <ProviderName>Boston Babes</ProviderName> 
     <Quantity>1</Quantity> 
     <UnitPrice>23.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1151464"> 
     <ProductName>Spritz Grape Seat and Extra Seat</ProductName> 
     <ProviderName>Bambeano</ProviderName> 
     <Quantity>1</Quantity> 
     <UnitPrice>56.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1148087"> 
     <ProductName>Dolby Metal-Black-Matte</ProductName> 
     <ProviderName>Vestal Watches</ProviderName> 
     <Quantity>2</Quantity> 
     <UnitPrice>67.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1150197"> 
     <ProductName>Vercilli Blk-Tan</ProductName> 
     <ProviderName>Boston Babes</ProviderName> 
     <Quantity>2</Quantity> 
     <UnitPrice>23.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1150173"> 
     <ProductName>Lucille Tan</ProductName> 
     <ProviderName>Boston Babes</ProviderName> 
     <Quantity>1</Quantity> 
     <UnitPrice>24.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1151464"> 
     <ProductName>Spritz Grape Seat and Extra Seat</ProductName> 
     <ProviderName>Bambeano</ProviderName> 
     <Quantity>1</Quantity> 
     <UnitPrice>56.99</UnitPrice> 
    </Item> 
    <Item ItemNumber="1148089"> 
     <ProductName>Plexi Leather-Silver-Black</ProductName> 
     <ProviderName>Vestal Watches</ProviderName> 
     <Quantity>1</Quantity> 
     <UnitPrice>189.99</UnitPrice> 
    </Item> 
</Items> 

Обратите внимание, что исходный XML содержит несколько же ProductName элементов с различными ItemNumber атрибутами. Я хочу сгруппировать все элементы Item с похожими ItemNumber и суммировать количество. Спасибо за помощь, ребята! Действительно ценю это.

Пример вывода будет: enter image description here

+1

Мы не можем помочь, если вы не объясните исходный XML, на котором этот XSLT должен работать. – ABach

+0

Извините, я отредактировал код, спасибо @ABach – danial

+0

Рассмотрите возможность публикации вывода, который вы хотите использовать для образца ввода XML, который вы сейчас разместили. Почему вы выполняете 'distinct-values ​​(./ ItemName)'? У вашего опубликованного образца нет элементов 'ItemName', только' ProductName' и 'ProviderName'. –

ответ

3

Пожалуйста, ознакомьтесь с измененной версией вашей XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="/"> 
    <table> 
     <thead> 
     <tr> 
      <th> 
      <xsl:text>Item Number</xsl:text> 
      </th> 
      <th> 
      <xsl:text>Quantity</xsl:text> 
      </th> 
      <th> 
      <xsl:text>Unit Price</xsl:text> 
      </th> 
      <th> 
      <xsl:text>Total</xsl:text> 
      </th> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:for-each-group select="Items/Item" group-by="@ItemNumber"> 
      <xsl:sort select="current-grouping-key()"/> 
      <tr> 
      <td> 
       <xsl:value-of select="current-grouping-key()"/> 
      </td> 
      <td> 
       <xsl:value-of select="sum(current-group()/Quantity)"/> 
      </td> 
      <td> 
       <xsl:value-of select="current-group()/UnitPrice"/> 
      </td> 
      <td> 
       <xsl:value-of 
       select="sum(for $x in current-group() return $x/UnitPrice * $x/Quantity)"/> 
      </td> 
      </tr> 
      <xsl:apply-templates select="current-group()"/> 
     </xsl:for-each-group> 
     </tbody> 
    </table> 
    </xsl:template> 

    <xsl:template match="Item"> 
    <xsl:value-of select="distinct-values(./ItemName)"/> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<table> 
    <thead> 
     <tr> 
     <th>Item Number</th> 
     <th>Quantity</th> 
     <th>Unit Price</th> 
     <th>Total</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td>1148087</td> 
     <td>6</td> 
     <td>67.99</td> 
     <td>407.93999999999994</td> 
     </tr> 
     <tr> 
     <td>1148089</td> 
     <td>1</td> 
     <td>189.99</td> 
     <td>189.99</td> 
     </tr> 
     <tr> 
     <td>1150173</td> 
     <td>1</td> 
     <td>24.99</td> 
     <td>24.99</td> 
     </tr> 
     <tr> 
     <td>1150197</td> 
     <td>3</td> 
     <td>23.99</td> 
     <td>71.97</td> 
     </tr> 
     <tr> 
     <td>1151464</td> 
     <td>2</td> 
     <td>56.99</td> 
     <td>113.98</td> 
     </tr> 
    </tbody> 
</table> 
+0

Сумма (для $ x в текущей группе() return $ x/UnitPrice * $ x/Количество) 'можно сократить до' sum (current-group()/(UnitPrice * Quantity)) '. –

+0

Привет @MartinHonnen, все равно, чтобы получить промежуточный итог суммы (current-group()/(UnitPrice * Quantity)) для разных групп элементов. Я добавил примерный результат ниже, как получить итоговый итог и грантот? Спасибо за вашу помощь – danial

+0

Как вы рассчитываете Grand Total? –

0

Я думаю, что вы просто хотите, чтобы гнездиться два for-each-group:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 

<xsl:output method="html" version="5.0" indent="yes"/> 

<xsl:template match="Items"> 
    <table> 
    <xsl:for-each-group select="Item" group-by="ProviderName"> 
     <tbody> 
     <tr> 
      <th colspan="4">Provider: <xsl:value-of select="current-grouping-key()"/></th> 
     </tr> 
     <tr> 
      <th>Item Number</th> 
      <th>Quantity</th> 
      <th>Unit Price</th> 
      <th>Total</th> 
     </tr> 
     </tbody> 
     <tbody> 
     <xsl:for-each-group select="current-group()" group-by="@ItemNumber"> 
      <tr> 
      <td><xsl:value-of select="current-grouping-key()"/></td> 
      <td><xsl:value-of select="sum(current-group()/Quantity)"/></td> 
      <td><xsl:value-of select="UnitPrice"/></td> 
      <td><xsl:value-of select="format-number(sum(current-group()/(Quantity * UnitPrice)), '0.00')"/></td> 
      </tr> 
     </xsl:for-each-group> 
     </tbody> 
     <tbody> 
     <tr> 
      <th colspan="3">Subtotal</th> 
      <td><xsl:value-of select="format-number(sum(current-group()/(Quantity * UnitPrice)), '0.00')"/></td> 
     </tr> 
     </tbody> 
    </xsl:for-each-group> 
     <tbody> 
     <tr> 
      <th colspan="3">Total</th> 
      <td><xsl:value-of select="format-number(sum(Item/(Quantity * UnitPrice)), '0.00')"/></td> 
     </tr> 
     </tbody> 
    </table> 
</xsl:template> 

</xsl:stylesheet>