我是XSL的新手,并提出以下问题:
我需要创建一个包含以下数据的表,并在末尾添加一个额外的列:
<datafields>
<field Name='name' />
<field Name='lastname' />
<field Name='user' />
<field Name='text' />
</datafields>
<form>
<comment name='Maria' lastname='smith' user='smithm' text='hello' />
<comment name='Julia' lastname='smith' user='smithm' text='hello' />
<comment name='Luke' lastname='smith' user='smithm' text='hello' />
<comment name='Martin' lastname='smith' user='smithm' text='hello' />
<comment name='Fred' lastname='jones' user='jonesm' text='hello' />
</form>
我将如何做到这一点?
答案 0 :(得分:0)
假设提供的XML是一个格式良好的XML,那么当你接受这个输入时:
<root>
<datafields>
<field Name='name' />
<field Name='lastname' />
<field Name='user' />
<field Name='text' />
</datafields>
<form>
<comment name='Maria' lastname='smith' user='smithm' text='hello' />
<comment name='Julia' lastname='smith' user='smithm' text='hello' />
<comment name='Luke' lastname='smith' user='smithm' text='hello' />
<comment name='Martin' lastname='smith' user='smithm' text='hello' />
<comment name='Fred' lastname='jones' user='jonesm' text='hello' />
</form>
</root>
并在其上使用此XSL 1.0转换:
<xsl:template match="/">
<table>
<xsl:apply-templates />
</table>
</xsl:template>
<xsl:template match="datafields">
<tr>
<xsl:for-each select="field">
<th>
<xsl:value-of select="@Name" />
</th>
</xsl:for-each>
</tr>
</xsl:template>
<xsl:template match="form">
<xsl:for-each select="comment">
<tr>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="@lastname"/>
</td>
<td>
<xsl:value-of select="@user"/>
</td>
<td>
<xsl:value-of select="@text"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
然后它会产生这个结果:
<table>
<tr>
<th>name</th><th>lastname</th><th>user</th><th>text</th>
</tr>
<tr>
<td>Maria</td><td>smith</td><td>smithm</td><td>hello</td>
</tr>
<tr>
<td>Julia</td><td>smith</td><td>smithm</td><td>hello</td>
</tr>
<tr>
<td>Luke</td><td>smith</td><td>smithm</td><td>hello</td>
</tr>
<tr>
<td>Martin</td><td>smith</td><td>smithm</td><td>hello</td>
</tr>
<tr>
<td>Fred</td><td>jones</td><td>jonesm</td><td>hello</td>
</tr>
</table>
此转换将为datafields
中的每个项创建一个表标题行,并为comment
中的每个form
创建一个数据行。
如果您需要额外的列,就像您提到的那样,您只需在第二个和第三个模板中添加空单元格。如果它应该生成一个完整有效的HTML页面,那么您需要将相应的标记添加到<table>
标记周围的第一个模板中。