【问题标题】:Using xsl to fill in empty rows in a html table使用xsl填充html表格中的空行
【发布时间】:2012-05-17 18:50:16
【问题描述】:

我想使用 XML 作为输入并使用 xsl 作为转换语言来创建多个 html 表格页面。 现在这些表格应该总是有一个固定的高度,无论是一排还是十排。 我无法让它与 CSS(最小高度)一起使用。 所以我想知道,是否有可能让 xsl 始终输出十行并添加空行以防万一少于十行或添加行以防 XML 中存在多于十行并因此调整表的大小。

有什么想法可以实现吗?

【问题讨论】:

    标签: html css xml xslt html-table


    【解决方案1】:

    你肯定能做到。当你没有足够的数据时,我可以向你展示如何将你的数据拆分成表,每个表有十行,用虚拟行填充最后一个(或者可能是唯一一个)。它应该可以帮助你去你需要去的地方(没有示例 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() &lt; 10]"/>
                <xsl:call-template name="dummy-rows">
                    <xsl:with-param 
                           name="how-many" 
                           select="9 - count(following-sibling::row[position() &lt; 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 &gt; 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>
    

    这个想法是您从每组 10 个节点的“第一个”节点开始您的 table。这就是 [position() mod 10 = 1] 谓词。当您掌握表的起点时,您将创建表边界并以正常模式再次处理该节点。然后你会得到它后面的九个数据行。最后,根据需要添加尽可能多的虚拟节点,以确保每个表中总共有 10 个。 dummy-rows 模板是一个递归。所以这里有两种技术:通过position() mod 拆分集合并使用recursion 来实现迭代。

    更新如果您只需要确保表中至少有十行,那么您不需要拆分逻辑:

    <?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 &gt; 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>
    

    在这两种情况下,结果都符合预期。尝试一下。你应该可以从这里拿走它。

    【讨论】:

    • 感谢您的示例。但是,当我使用您提供的数据并有 12 行时,会插入 8 个虚拟行。如果存在超过十行,我想要的是不添加任何虚拟文本,而是添加真实数据行。因此,对于十二行示例,只会显示十二行。谢谢。
    • 所以基本上要确保一张桌子上至少有十个?如果少的话,就用假人把它塞满,否则就把所有东西都放在一张桌子上?我发布了更新。没有拆分非常简单
    • 出于兴趣:可以插入相应的行号而不是“虚拟”行吗?如果我的 for-each 表循环中有一个
    • @TonyC,xsl:number 只会格式化数字。您需要首先使用 position()$how-may 变量计算行号
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多