假设我有一个包含XML标签中500个名字的列表。我想使用XSLT在表中显示此列表。在XSLT表中,我希望最多有三行;我不在乎我有多少列 - 我打算将表放入可滚动的div中。如果我的名字列表增长到1,000,我仍然只需要三行,但列数可以增长到它需要的任何大小。
如何在XSLT中执行此操作?就XSL表而言,我熟悉xsl:for-each,但就是这样。
格式是这样的:
< node1> < node2> < NAME>数据< / NAME> < NAME>数据< / NAME> ... < / node2> < / node1>
答案 0 :(得分:1)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pnumRows" select="3"/>
<xsl:variable name="vnumCells" select="count(/*/*/NAME)"/>
<xsl:variable name="vcellsPerRow"
select="ceiling($vnumCells div $pnumRows)"/>
<xsl:template match="node2">
<table>
<xsl:apply-templates select="NAME[position() mod $vcellsPerRow = 1]"/>
</table>
</xsl:template>
<xsl:template match="NAME">
<tr>
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >= $vcellsPerRow)]"/>
</tr>
</xsl:template>
<xsl:template match="NAME" mode="copy">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
在具有指定格式的任何XML文档上执行时,例如以下:
<node1>
<node2>
<NAME>name1</NAME>
<NAME>name2</NAME>
<NAME>name3</NAME>
<NAME>name4</NAME>
<NAME>name5</NAME>
<NAME>name6</NAME>
<NAME>name7</NAME>
<NAME>name8</NAME>
<NAME>name9</NAME>
<NAME>name10</NAME>
</node2>
</node1>
生成想要的结果:一个包含三行的表,其中前两行具有相同数量的单元格,最后一行可能更短:
<table>
<tr>
<td>name1</td>
<td>name2</td>
<td>name3</td>
<td>name4</td>
</tr>
<tr>
<td>name5</td>
<td>name6</td>
<td>name7</td>
<td>name8</td>
</tr>
<tr>
<td>name9</td>
<td>name10</td>
</tr>
</table>
答案 1 :(得分:0)
如果您正在讨论使用XSLT将XML转换为HTML表格,我建议您查看this article。他提供了一些模板,可以让你做你正在谈论的事情,但它可能需要一些调整。