分组元素并在xslt中添加元素值

时间:2014-01-28 12:15:30

标签: xslt

源文件: 以下是xml文档。

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

1 个答案:

答案 0 :(得分: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>