通过列变量进行XSLT动态循环

时间:2012-01-04 18:24:27

标签: xml xslt

我想动态循环以下XML来创建以下表结构:

  

日期|时间|年   
01/04 | 11:25:50 | 2012   
01/01 | 1:05:20 | 2012

XML结构分解了Columns和Rows,因此我需要传递Column Description属性并使用它们来分隔Row属性。

XML:

<Rowsets>
 <Rowset>
    <Columns>
        <Column Description="Date"/>
        <Column Description="Time"/>
        <Column Description="Year"/>
    </Columns>
    <Row>
        <Date>01/04</Date>
        <Time>11:25:50</Time>
        <Year>2012</Year>
    </Row>
    <Row>
        <Date>01/01</Date>
        <Time>1:05:20</Time>
        <Year>2012</Year>
    </Row>
 </Rowset>
</Rowsets>

我尝试的 XSLT 会创建标题,但会将Row数据整合到一个列中:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>  
  <body>
    <table border="1" cellspacing="0">
      <!-- Generate the row of table header cells -->
      <tr>
    <xsl:variable name="currentvar" select="//@Description[1]"/>
        <xsl:for-each select="$currentvar">
          <th>
            <xsl:value-of select="."/>
          </th>
        </xsl:for-each>
      </tr>
  <xsl:for-each select="Rowsets/Rowset/Row">
   <tr>
    <td>
              <xsl:value-of select="."/>
    </td>
       </tr>
      </xsl:for-each>       
  </table> 
  </body>
 </html>
</xsl:template>
</xsl:stylesheet>

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

通过将表格的每个部分分解为自己的模板,可以大大简化样式表。这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <html>
            <body>
                <table border="1" cellspacing="0">
                    <xsl:apply-templates/>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="Columns|Row">
        <tr><xsl:apply-templates/></tr>
    </xsl:template>
    <xsl:template match="Columns/*">
        <th><xsl:apply-templates select="@Description"/></th>
    </xsl:template>
    <xsl:template match="Row/*">
        <td><xsl:apply-templates/></td>
    </xsl:template>
</xsl:stylesheet>

产生所需的结果:

<html>
   <body>
      <table border="1" cellspacing="0">
         <tr>
            <th>Date</th>
            <th>Time</th>
            <th>Year</th>
         </tr>
         <tr>
            <td>01/04</td>
            <td>11:25:50</td>
            <td>2012</td>
         </tr>
         <tr>
            <td>01/01</td>
            <td>1:05:20</td>
            <td>2012</td>
         </tr>
      </table>
   </body>
</html>

说明:请注意,我们让XSLT处理器完成大部分工作。我们只需在文档的每个级别应用模板,这会将处理移动到上下文节点的子级。 (由于XSLT的built-in templates,不需要显式循环任何元素或输出任何文本。)然后,我们在自己的模板中处理每个表部分。这是一种更加灵活,可维护和可读的方法。

答案 1 :(得分:0)

这是因为您尝试选择<Row>元素的全部内容。替换

<td><xsl:value-of select="."/></td>

<td><xsl:value-of select="Date"/></td>
<td><xsl:value-of select="Time"/></td>
<td><xsl:value-of select="Year"/></td>

将解决您的问题。