我的输入 XML 文档是一个简单的项目列表。项目的数量是任意的:
<items>
<item name="item1"/>
<item name="item2"/>
<item name="item3"/>
...
<item name="itemX"/>
</items>
现在,我想将此列表拆分为 HTML 表格。行数和列数作为参数值给出:
<xsl:param name="rows"/>
<xsl:param name="cols"/>
如果我们让 rows 为 3,cols 为 2,则生成的 HTML 应该如下所示:
<table>
<tr>
<td>item1</td>
<td>item2</td>
</tr>
<tr>
<td>item3</td>
<td>item4</td>
</tr>
<tr>
<td>item5</td>
<td>item6</td>
</tr>
</table>
<table>
<tr>
<td>item7</td>
<td>item8</td>
</tr>
<tr>
<td>item9</td>
<td>item10</td>
</tr>
<tr>
<td>item11</td>
<td>item12</td>
</tr>
</table>
...
<table>
因此创建的 s的数量是ceil(number_of_items / rows / cols)
我有一个基本的想法如何解决这个问题,但我似乎无法正确进行最后的调整。下面的样式表产生的东西接近我想要的,但第 4、7、10 和 13 项是重复的。有没有人对如何做到这一点有更好的想法?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="cols" select="2"/>
<xsl:param name="rows" select="3"/>
<xsl:template match="/*">
<html>
<head/>
<body>
<xsl:apply-templates select="*[position() mod ($cols * $rows) = 1]" mode="table"/>
</body>
</html>
</xsl:template>
<xsl:template match="*" mode="table">
<table border="1" id="{@name}">
<xsl:apply-templates select="." mode="row"/>
<xsl:apply-templates select="following-sibling::*[position() > 1 and position() mod $rows = 0]" mode="row"/>
</table>
</xsl:template>
<xsl:template match="*" mode="row">
<tr id="{@name}">
<xsl:apply-templates select="." mode="cell"/>
<xsl:apply-templates select="following-sibling::*[position() < $cols]" mode="cell"/>
</tr>
</xsl:template>
<xsl:template match="*" mode="cell">
<td>
<xsl:apply-templates select="."/>
</td>
</xsl:template>
<xsl:template match="item">
<xsl:value-of select="@name"/>
</xsl:template>
</xsl:stylesheet>