You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSLT实现XML转HTML表格时每行仅显示4个元素?

实现XML转HTML表格:每行固定显示4个member元素

需要将XML中的<member>元素转换为HTML表格,要求每行恰好显示4个member条目,现有XSL代码无法实现该布局。以下是原始代码:

原始members.xml

<?xml version = "1.0"?> 
<?xml-stylesheet type = "text/xsl" href = "/teammembers_imports.xsl"?> 
<team>
    <heading>TEST TEAM</heading>
    <member>
        <name>Max Mustermann</name>
        <role>Product Owner</role>
    </member>
    <member>
        <name>Max Mustermann 2</name>
        <role>Product Owner</role>
    </member>
    <member>
        <name>Max Mustermann 3</name>
        <role>Product Owner</role>
    </member>
    <member>
        <name>Max Mustermann 4</name>
        <role>Product Owner</role>
    </member>
    <member>
        <name>Max Mustermann 5</name>
        <role>Product Owner</role>
    </member>
</team>

原始teammembers_imports.xsl

<?xml version = "1.0" encoding="UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match = "/">
      <html>
        <body>
          <table>
            <xsl:apply-templates/>
          </table>
        </body>
      </html>
    </xsl:template>
    
    <xsl:template match="member">
      <td>
        <xsl:value-of select="name"/>
      </td>
    </xsl:template>
  </xsl:stylesheet>

修改后的XSL解决方案

<?xml version = "1.0" encoding="UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match = "/">
      <html>
        <body>
          <table border="1">
            <!-- 处理团队标题作为表格表头 -->
            <tr>
              <th colspan="4">
                <xsl:value-of select="team/heading"/>
              </th>
            </tr>
            <!-- 每4个member生成一行 -->
            <xsl:for-each select="team/member[position() mod 4 = 1]">
              <tr>
                <!-- 选取当前member及后续最多3个member -->
                <xsl:for-each select=". | following-sibling::member[position() &lt; 4]">
                  <td>
                    <strong><xsl:value-of select="name"/></strong><br/>
                    <small><xsl:value-of select="role"/></small>
                  </td>
                </xsl:for-each>
                <!-- 如果最后一行不足4个,补空单元格 -->
                <xsl:call-template name="fill-empty-cells">
                  <xsl:with-param name="remaining" select="4 - count(. | following-sibling::member[position() &lt; 4])"/>
                </xsl:call-template>
              </tr>
            </xsl:for-each>
          </table>
        </body>
      </html>
    </xsl:template>

    <!-- 补全空单元格的模板 -->
    <xsl:template name="fill-empty-cells">
      <xsl:param name="remaining"/>
      <xsl:if test="$remaining > 0">
        <td></td>
        <xsl:call-template name="fill-empty-cells">
          <xsl:with-param name="remaining" select="$remaining - 1"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>

    <!-- 屏蔽原始heading的默认输出 -->
    <xsl:template match="heading"/>
  </xsl:stylesheet>

核心逻辑说明

  1. 行生成规则:通过position() mod 4 = 1选取每一组的第一个member,以此作为每行的起点。
  2. 单元格填充:对每个起点member,选取自身及后续最多3个同级member,生成该行的所有单元格。
  3. 空单元格补全:如果最后一行的member数量不足4个,调用模板自动补全空单元格,保证每行结构统一。
  4. 标题处理:将<heading>内容作为表格的跨列表头,同时屏蔽其默认输出避免干扰表格结构。

内容的提问来源于stack exchange,提问作者Alex1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:06:32