我在转换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
,但我没有得到任何结果。我现在该怎么做?
感谢。
答案 0 :(得分:3)
这似乎对我有用:
<?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>
答案 1 :(得分:2)
我使用此(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
...并且还使用了更多列。
希望有所帮助!干杯