XSLT 1.0使用Muenchian方法创建表格遇分组问题求修正
解决XSLT 1.0表格生成不符合预期的问题
我看了你的XML输入和现有XSLT代码,问题主要出在两个地方:
- 你设置的分组逻辑完全多余:你的每个
<title>的@index都是唯一的,所以分组判断generate-id(.) = generate-id(key(...)[1])会匹配每一个title,分组操作等于没起作用。 - 你的表格定义了4列,但现有代码只填充了2列(索引和作品名),既没有区分媒体类型(音乐CD/电影DVD),也没有展示艺术家/演员的信息,导致表格结构不符合预期。
假设你想要的目标表格是每行对应一个作品,4列分别为「媒体类型」「索引」「作品名称」「创作者」,可以用下面的XSLT代码修改:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="html" encoding="utf-8"/> <xsl:template match="/"> <html> <body> <table border="1"> <tr bgcolor="#9acd32"> <th class="underline" align="center" lang="en">媒体类型</th> <th class="underline" align="center" lang="en">索引</th> <th class="underline" align="center" lang="en">作品名称</th> <th class="underline" align="center" lang="en">创作者</th> </tr> <!-- 遍历所有音乐CD的title --> <xsl:for-each select="catalog/collection/musiccd/title"> <tr> <td>音乐CD</td> <td><xsl:value-of select="@index"/></td> <td><xsl:value-of select="@name"/></td> <td><xsl:value-of select="person/artist/@name"/></td> </tr> </xsl:for-each> <!-- 遍历所有电影DVD的title --> <xsl:for-each select="catalog/collection/moviedvd/title"> <tr> <td>电影DVD</td> <td><xsl:value-of select="@index"/></td> <td><xsl:value-of select="@name"/></td> <td><xsl:value-of select="person/actor/@name"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
代码修改说明:
- 移除了冗余的分组逻辑:因为你的每个
@index都是唯一值,分组操作没有实际意义,直接遍历所有title即可。 - 完善了表格列内容:根据表头的4列定义,填充了「媒体类型」「创作者」两个缺失的内容,其中创作者会根据当前作品是音乐还是电影,分别提取
<artist>或<actor>的名称。 - 保持了XSLT 1.0兼容性:所有语法都符合XSLT 1.0的规范,没有使用更高版本的特性。
如果你的目标表格结构和我假设的不同,可以补充说明具体的预期样式,我再帮你调整代码~
内容的提问来源于stack exchange,提问作者Denniel M.
相关产品推荐
相关产品推荐

