如何用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() < 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() < 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>
核心逻辑说明
- 行生成规则:通过
position() mod 4 = 1选取每一组的第一个member,以此作为每行的起点。 - 单元格填充:对每个起点member,选取自身及后续最多3个同级member,生成该行的所有单元格。
- 空单元格补全:如果最后一行的member数量不足4个,调用模板自动补全空单元格,保证每行结构统一。
- 标题处理:将
<heading>内容作为表格的跨列表头,同时屏蔽其默认输出避免干扰表格结构。
内容的提问来源于stack exchange,提问作者Alex1
相关产品推荐
相关产品推荐

