使用XSLT2进行XML转换分组

时间:2012-02-02 14:39:33

标签: xml xslt xpath xslt-2.0 xpath-2.0

我是XSLT的新手,在尝试使用XSLT2和altovaXML处理器时遇到以下问题。

<?xml version="1.0"?>
 <document>
  <row>
   <WEEK>11</WEEK>
   <PERIOD>201103</PERIOD>
   <ILPROD>some item</ILPROD>
   <CNME>some name</CNME>
   <QTY>100</QTY>
   <SP>40</SP>
   <REV>4000</REV>
   <COST>2000</COST>
   <VA>2000</VA>
   <VAP>50</VAP>
  </row>
</document>

我的XSL如下

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
  <html>
  <body>
  <h2>Some text</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Analysis</th>
    </tr>
    <xsl:for-each-group select="document/row" group-by="ILPROD">
    <xsl:for-each select="current-group()">
      <tr>
      <td><xsl:value-of select="WEEK"/></td>
      <td><xsl:value-of select="PERIOD"/></td>
      <td><xsl:value-of select="ILPROD"/></td>
    </tr>
    </xsl:for-each>
    <tr><td>&nbsp</td></tr>
    </xsl:for-each-group>
    </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

很简单,我正在尝试按“ILPROD”子节点进行分组,并在每个组后输出一个空格。听起来很简单,但我显然犯了一个基本错误,因为处理器说它无法加载文档。如果我删除分组,它可以正常工作。

我出错的任何想法?

1 个答案:

答案 0 :(得分:1)

尝试使用以下代替&amp; nbsp(顺便错过分号):

<tr><td colspan="3"><br></br></td></tr>

不要忘记将输出更改为html:

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

<xsl:output method="html"/>

<xsl:template match="/">
  <html>
  <body>
  <h2>Some text</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Analysis</th>
    </tr>
    <xsl:for-each-group select="document/row" group-by="ILPROD">
    <xsl:for-each select="current-group()">
      <tr>
      <td><xsl:value-of select="WEEK"/></td>
      <td><xsl:value-of select="PERIOD"/></td>
      <td><xsl:value-of select="ILPROD"/></td>
    </tr>
    </xsl:for-each>
    <tr><td colspan="3"><br></br></td></tr>
    </xsl:for-each-group>
    </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

当我在Altova XML中运行它时,我得到了正确的输出:

<html>
    <body>
        <h2>Some text</h2>
        <table border="1">
            <tr bgcolor="#9acd32">
                <th>Analysis</th>
            </tr>
            <tr>
                <td>11</td>
                <td>201103</td>
                <td>some item</td>
            </tr>
            <tr>
                <td colspan="3"><br></td>
            </tr>
        </table>
    </body>
</html>