求助:使用嵌套xsl:for-each实现XML数据的表格行列展示
XML/XSL 表格生成问题
需要将给定XML中的list-type作为表格列,对应types的type属性作为列内行数据,生成指定格式的表格。
源XML数据
<list-inventory list-count="2"> <list list-type="Standard" list-order = "1" count-Types = "3"> <types type="BEN2D"></types> <types type="BESH2D"></types> <types type="HNK"></types> </list> <list list-type="Deluxe" list-order = "2" count-Types = "3"> <types type="SNK"></types> <types type="TESTKD"></types> <types type="TESTKD"></types> </list> </list-inventory>
注:原XML中</room>为错误标签,已修正为</types>
期望表格格式
Standard | Deluxe BEN2D | SNK BESH2D | TESTKD HNK | TESTKD
尝试的XSL代码(存在问题)
<xsl:for-each select="/contents/list-inventory/list"> <tr> <td class="alt-th" style="border:1px solid black"> <xsl:value-of select="@list-type"/> </td> </tr> <tr> <td style="border:1px solid black"> <xsl:for-each select="/contents/list-inventory/list/types"> <span><xsl:value-of select="@type"/></span> <xsl:if test="position()!=last()"> <br/> </xsl:if> </xsl:for-each> </td> </tr> </xsl:for-each>
问题点:
- 所有
list-type显示在单列,而非横向多列 - 仅展示第一个
list的types值,未对应每个列的行数据
正确的XSL实现方案
核心思路:先遍历所有list生成横向表头,再按行号匹配每个list中对应位置的types值,生成表体行。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <table border="1"> <!-- 生成表头:每个list-type对应一列 --> <tr> <xsl:for-each select="list-inventory/list"> <th><xsl:value-of select="@list-type"/></th> </xsl:for-each> </tr> <!-- 生成表体:按types的位置遍历,每行对应每个list的第n个types --> <xsl:variable name="rowCount" select="list-inventory/list[1]/types"/> <xsl:for-each select="$rowCount"> <xsl:variable name="currentRow" select="position()"/> <tr> <xsl:for-each select="/list-inventory/list"> <td><xsl:value-of select="types[$currentRow]/@type"/></td> </xsl:for-each> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
代码说明
- 表头生成:通过
for-each遍历所有list,将每个list-type作为表头单元格,实现横向多列布局。 - 表体生成:
- 以第一个
list的types数量作为行数基准(假设所有list的types数量一致) - 遍历每个
types的位置,记录当前行号currentRow - 再次遍历所有
list,取出对应行号的types的type属性值,填充到该行的对应列中
- 以第一个
- 问题修正:
- 原代码循环
list时每次生成新行,导致纵向单列,改为横向遍历生成多列 - 原代码使用绝对路径取所有
types,改为结合位置变量精准获取对应行的types值
- 原代码循环
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

