我在转换XML结构时遇到问题:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="ceva.xsl"?>
<!-- Edited by XMLSpy® -->
<reports>
<report_head>
<value>product_id</value>
<value>product_name</value>
</report_head>
<report_data>
<value>1</value>
<value>PRODUCT NAME NO 43</value>
</report_data>
<report_data>
<value>2</value>
<value>PRODUCT NAME NO 56</value>
</report_data>
<report_data>
<value>3</value>
<value>PRODUCT NAME NO 65</value>
</report_data>
</reports>
进入类似的表格
<table>
<tr>
<td>product_id</td>
<td>product_name</td>
</tr>
<tr>
<td>1</td>
<td>PRODUCT NAME NO 43</td>
</tr>
<tr>
<td>2</td>
<td>PRODUCT NAME NO 56</td>
</tr>
<tr>
<td>3</td>
<td>PRODUCT NAME NO 65</td>
</tr>
</table>
这是我正在使用的XSL:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Transform a table</h2>
<!--
<table border="1">
<tr>
<xsl:for-each select="reports/report_head/value">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
<xsl:for-each select="reports/report_data/value">
<tr>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</table>
-->
<table border="1">
<tr>
<xsl:apply-templates/>
</tr>
</table>
</body>
</html>
</xsl:template>
<!--
<xsl:template match="value">
<tr>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:template>
</table>
-->
<xsl:template match="value">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
但是等等,还有更多,我不知道有多少列。一个典型的报告可能有10列,但可能有20、30多列,因此xslt必须动态地执行此操作。
我尝试过for-each
,有人建议使用template
,但我没有得到任何结果。我现在该怎么办?
谢谢。
这似乎对我有效:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Transform a table</h2>
<table border="1">
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="report_data | report_head">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="value">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
我使用了这个(http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog)快速原型设计的小工具(请参阅http://www.w3schools.com/xsl/default.asp了解更多)。如果我理解得对的话,我想这就行了:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Transform a table</h2>
<table border="1">
<tr>
<xsl:for-each select="reports/report_head/value">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
<xsl:for-each select="reports/report_data">
<tr>
<xsl:for-each select="./value">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
编辑#1:修复错误放置的</tr>
它生成了这个表。。。
product_id product_name
1 PRODUCT NAME NO 43
2 PRODUCT NAME NO 56
3 PRODUCT NAME NO 65
并且还处理了更多的列。
希望能有所帮助!干杯