我想动态循环以下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>
感谢任何帮助,谢谢!
答案 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>
将解决您的问题。