2014-01-28 3 views
1

исходный документ: Ниже представлен документ xml.и добавление их значений элементов в xslt

<?xml version="1.0"?> 
<Library> 
<Book code="123"> 
    <BookName>XML</BookName> 
    <Category>Programming</Category> 
    <Quantity>10</Quantity> 
    <Price>100</Price> 
</Book> 
<Book code="345"> 
    <BookName>Photoshop</BookName> 
    <Category>Design</Category> 
    <Quantity>50</Quantity> 
    <Price>200</Price> 
</Book> 
<Book code="123"> 
    <BookName>XML</BookName> 
    <Category>Programming</Category> 
    <Quantity>5</Quantity> 
    <Price>100</Price> 
</Book> 
<Book code="345"> 
    <BookName>Photoshop</BookName> 
    <Category>Design</Category> 
    <Quantity>10</Quantity> 
    <Price>200</Price> 
</Book> 
    <Book code="456"> 
    <BookName>Illustrator</BookName> 
    <Category>Design</Category> 
    <Quantity>100</Quantity> 
    <Price>300</Price> 
</Book>  
</Library> 

таблицы стилей XSLT: это настоящая таблица стилей. Я попытался использовать xslt 2. Однако я не получаю, как получить желаемый результат.

<?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> 
<body> 
<h1>Books Information</h1> 
<table border="1"> 
<xsl:for-each-group select="Library/Book" group-by="Category"> 
<xsl:sort select="current-grouping-key()"/> 
<tr> 
<td colspan="4">Category: 
    <b> 
    <xsl:value-of select="current-grouping-key()"/> 
    </b> 
</td> 
</tr> 
<tr> 
    <th>Book Code</th> 
    <th>Quantity</th> 
    <th>Unit Price</th> 
    <th>Price</th> 
</tr>  
<xsl:apply-templates select="current-group()"> 
    <xsl:sort select="@code"/> 
</xsl:apply-templates> 

</xsl:for-each-group> 
</table> 
</body> 
</html> 
</xsl:template> 
<xsl:template match="Book"> 
<tr> 
    <td><xsl:value-of select="@code"/></td> 
    <td><xsl:value-of select="Quantity"/></td> 
    <td><xsl:value-of select="Price"/></td> 
    <td> </td> 
</tr> 
    </xsl:template> 
</xsl:stylesheet> 

выходной ток

<html> 
    <body> 
    <h1>Books Information</h1> 
    <table border="1"> 
    <tr> 
     <td colspan="4">Category: 
       <b>Design</b></td> 
    </tr> 
    <tr> 
     <th>Book Code</th> 
     <th>Quantity</th> 
     <th>Unit Price</th> 
     <th>Price</th> 
    </tr> 
    <tr> 
     <td>345</td> 
     <td>50</td> 
     <td>200</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>345</td> 
     <td>10</td> 
     <td>200</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>456</td> 
     <td>100</td> 
     <td>300</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td colspan="4">Category: 
       <b>Programming</b></td> 
    </tr> 
    <tr> 
     <th>Book Code</th> 
     <th>Quantity</th> 
     <th>Unit Price</th> 
     <th>Price</th> 
    </tr> 
    <tr> 
     <td>123</td> 
     <td>10</td> 
     <td>100</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>123</td> 
     <td>5</td> 
     <td>100</td> 
     <td></td> 
    </tr> 
    </table> 
    </body> 
</html> 

ожидается выход

<html> 
    <body> 
    <h1>Books Information</h1> 
    <table border="1"> 
    <tr> 
     <td colspan="4">Category: 
       <b>Design</b></td> 
    </tr> 
    <tr> 
     <th>Book Code</th> 
     <th>Quantity</th> 
     <th>Unit Price</th> 
     <th>Price</th> 
    </tr> 
    <tr> 
     <td>345</td> 
     <td>60</td> 
     <td>200</td> 
     <td>1200</td> 
    </tr> 
    <tr> 
     <td>456</td> 
     <td>100</td> 
     <td>300</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td colspan="4">Subtotal: 1500</td> 
    </tr> 
    <tr> 
     <td colspan="4">Category: 
       <b>Programming</b></td> 
    </tr> 
    <tr> 
     <th>Book Code</th> 
     <th>Quantity</th> 
     <th>Unit Price</th> 
     <th>Price</th> 
    </tr> 
    <tr> 
     <td>123</td> 
     <td>15</td> 
     <td>1500</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td colspan="4">subtotal: 1500</td> 
    </tr> 
    <tr> 
     <td colspan="4">Grand TOtal: 3000</td> 
    </tr> 
    </table> 
</body> 
</html> 
+2

Так вы хотите, чтобы вычислить промежуточные итоги, какие значения вы хотите вычислить промежуточные итоги, от стоимости всех элементов в группе или продукта Количество и цена всех товаров в группе? –

+0

Я хочу добавить количество всех книг, имеющих один и тот же код, и умножить их на цену за единицу и отобразить общую цену в столбце Price i.e. [количество * цена = общая цена] [промежуточный итог будет основан на категории]. Спасибо Martin – user3243634

+0

Да Я хочу вычислить Продукт количества и цены всех товаров в группе – user3243634

ответ

2

Похоже, что вы делаете два лота группировки здесь. Сначала «категория» и внутри каждой категории вы группируете «Код».

Вы первая группировка выглядит хорошо, но вторая группа, вам нужно заменить эти строки ...

<xsl:apply-templates select="current-group()"> 
    <xsl:sort select="@code"/> 
</xsl:apply-templates> 

С этими линиями, как это будет тогда группа книги в пределах текущей категории по их коде

<xsl:for-each-group select="current-group()" group-by="@code"> 
    <xsl:sort select="current-grouping-key()" /> 
    <xsl:apply-templates select="." /> 
</xsl:for-each-group> 

с точки зрения получения итогов по каждой группе, вы можете использовать это выражение

<xsl:value-of select="sum(current-group()/(Quantity * Price))" /> 

Это будет работать для обеих групп, поэтому его можно использовать для получения суммы для «кода» и суммы для «категории». Для общей суммы, было бы просто это

<xsl:value-of select="sum(Library/Book/(Quantity * Price))" /> 

Попробуйте этот XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
<h1>Books Information</h1> 
<table border="1"> 
<xsl:for-each-group select="Library/Book" group-by="Category"> 
<xsl:sort select="current-grouping-key()"/> 
<tr> 
<td colspan="4">Category: 
    <b> 
    <xsl:value-of select="current-grouping-key()"/> 
    </b> 
</td> 
</tr> 
<tr> 
    <th>Book Code</th> 
    <th>Quantity</th> 
    <th>Unit Price</th> 
    <th>Price</th> 
</tr>  
<xsl:for-each-group select="current-group()" group-by="@code"> 
    <xsl:sort select="current-grouping-key()" /> 
    <xsl:apply-templates select="." /> 
</xsl:for-each-group> 
<tr> 
<td colspan="4">subtotal: <xsl:value-of select="sum(current-group()/(Quantity * Price))" /></td> 
</tr> 
</xsl:for-each-group> 
<tr> 
<td colspan="4">Total: <xsl:value-of select="sum(Library/Book/(Quantity * Price))" /></td> 
</tr> 
</table> 
</body> 
</html> 
</xsl:template> 
<xsl:template match="Book"> 
<tr> 
    <td><xsl:value-of select="@code"/></td> 
    <td><xsl:value-of select="Quantity"/></td> 
    <td><xsl:value-of select="Price"/></td> 
    <td><xsl:value-of select="sum(current-group()/(Quantity * Price))" /></td> 
</tr> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо большое Тим. Great HELP – user3243634

+0

Привет, Тим, не могли бы вы проверить эти вопросы. Я не знаю, как использовать для каждой группы здесь. http://stackoverflow.com/questions/21297376/xml-to-pdf-by-xsl-fo – user3243634

Смежные вопросы