我想使用 XML 作为输入和 xsl 作为转换语言来创建多个 html 表格页面。现在这些表格应该总是有一个固定的高度,无论是一排还是十排。我无法让它与 CSS(最小高度)一起使用。所以我想知道,是否有可能让 xsl 始终输出十行并添加空行以防万一少于十行或添加行以防 XML 中存在多于十行并因此调整表的大小。
有什么想法可以实现吗?
我想使用 XML 作为输入和 xsl 作为转换语言来创建多个 html 表格页面。现在这些表格应该总是有一个固定的高度,无论是一排还是十排。我无法让它与 CSS(最小高度)一起使用。所以我想知道,是否有可能让 xsl 始终输出十行并添加空行以防万一少于十行或添加行以防 XML 中存在多于十行并因此调整表的大小。
有什么想法可以实现吗?
你肯定能做到。当你没有足够的数据时,我可以向你展示如何将你的数据拆分为每张有十行的表,用虚拟行填充最后一行(或者可能是唯一一行)。它应该可以帮助你去你需要去的地方(没有示例 XML 输入和所需的 HTML 输出,这是我能做的)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates select="data/row[position() mod 10 = 1]" mode="newtable"/>
</xsl:template>
<xsl:template match="row" mode="newtable">
<table>
<xsl:apply-templates select="."/>
<xsl:apply-templates select="following-sibling::row[position() < 10]"/>
<xsl:call-template name="dummy-rows">
<xsl:with-param
name="how-many"
select="9 - count(following-sibling::row[position() < 10])"/>
</xsl:call-template>
</table>
</xsl:template>
<xsl:template match="row">
<tr><td><xsl:value-of select="."/></td></tr>
</xsl:template>
<xsl:template name="dummy-rows">
<xsl:param name="how-many" select="0"/>
<xsl:if test="$how-many > 0">
<tr><td>dummy</td></tr>
<xsl:call-template name="dummy-rows">
<xsl:with-param name="how-many" select="$how-many - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这个想法是你从table
每组 10 个节点的“第一个”节点开始。这就是[position() mod 10 = 1]
谓词。当您掌握表的起点时,您将创建表边界并以正常模式再次处理该节点。然后你会得到它后面的九个数据行。最后,根据需要添加尽可能多的虚拟节点,以确保每个表中总共有 10 个。dummy-rows
模板是一个递归。所以这里有两种技术:拆分集合position() mod
并使用 arecursion
来实现迭代。
更新如果您只需要确保表中至少有十行,那么您不需要拆分逻辑:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<table>
<xsl:apply-templates select="data/row"/>
<xsl:call-template name="dummy-rows">
<xsl:with-param
name="how-many"
select="10 - count(data/row)"/>
</xsl:call-template>
</table>
</xsl:template>
<xsl:template match="row">
<tr><td><xsl:value-of select="."/></td></tr>
</xsl:template>
<xsl:template name="dummy-rows">
<xsl:param name="how-many" select="0"/>
<xsl:if test="$how-many > 0">
<tr><td>dummy</td></tr>
<xsl:call-template name="dummy-rows">
<xsl:with-param name="how-many" select="$how-many - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
你可以用这样的输入试试这个:
<data>
<row>1</row>
<row>1</row>
<row>3</row>
</data>
或这样的输入:
<data>
<row>1</row>
<row>2</row>
<row>3</row>
<row>4</row>
<row>5</row>
<row>6</row>
<row>7</row>
<row>8</row>
<row>9</row>
<row>10</row>
<row>11</row>
<row>12</row>
</data>
在这两种情况下,结果都符合预期。尝试一下。你应该可以从这里拿走它。