按inicial属性分组XML元素的XSLT实现问题求助
解决XSLT1.0按
inicial属性分组的问题 嘿,我猜你应该是在用Muenchian分组法(XSLT1.0里最常用的分组方式)但没搞对关键步骤对吧?我之前踩过这个坑,给你梳理一下正确的实现思路,对比你可能出错的地方:
1. 先明确典型的XML结构示例
假设你的XML大概是这类需要分组的结构:
<root> <item inicial="A" name="Alpha"/> <item inicial="B" name="Bravo"/> <item inicial="A" name="Apple"/> <item inicial="C" name="Charlie"/> <item inicial="B" name="Banana"/> </root>
2. 常见的分组失败原因
很多人用key分组没效果,通常是这两个细节没做好:
- 定义key时,
use属性没正确指向inicial属性 - 没有筛选出每个分组的唯一标识节点(也就是每个
inicial值对应的第一个元素)
3. 正确的XSLT实现代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义分组key:匹配目标元素,按inicial属性作为分组依据 --> <xsl:key name="groupByInicial" match="item" use="@inicial"/> <xsl:template match="/root"> <html> <body> <!-- 筛选出每个分组的第一个节点,得到所有不重复的inicial值 --> <xsl:for-each select="item[generate-id() = generate-id(key('groupByInicial', @inicial)[1])]"> <!-- 可选:按inicial属性排序,让分组更整齐 --> <xsl:sort select="@inicial"/> <!-- 输出分组标题 --> <h2>分组: <xsl:value-of select="@inicial"/></h2> <!-- 遍历当前分组下的所有元素 --> <ul> <xsl:for-each select="key('groupByInicial', @inicial)"> <li><xsl:value-of select="@name"/></li> </xsl:for-each> </ul> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
4. 关键步骤拆解
- 定义key:
key的match要精准匹配你需要分组的元素(比如示例里的item),use明确指定分组依据为@inicial属性 - 筛选唯一分组:通过
generate-id()对比,只保留每个分组的第一个节点,这样就能得到所有不重复的inicial值 - 遍历分组内容:用
key('groupByInicial', @inicial)取出当前分组下的所有关联元素,完成内容输出
如果你的XML结构和示例不同(比如元素名不是item),只需要对应修改match规则和元素选择器就行。要是你能贴出具体的XML和XSL代码,我还能帮你精准排查问题~
内容的提问来源于stack exchange,提问作者user9564764
相关产品推荐
相关产品推荐

