如何使用xsl:number为XML节点生成指定格式的层级编号?
解决方案:使用xsl:number生成层级编号
正确的XSLT代码
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text" indent="yes"/> <xsl:template match="alphabets"> <xsl:apply-templates select="*"/> </xsl:template> <xsl:template match="*"> <!-- 根据元素层级生成缩进 --> <xsl:value-of select="string-join(for $i in 1 to (count(ancestor::*) - 1) return ' ', '')"/> <!-- 生成多级编号 --> <xsl:number count="*" level="multiple" format="1."/> <!-- 输出元素名称 --> <xsl:value-of select="local-name()"/> <xsl:text> </xsl:text> <!-- 递归处理子元素 --> <xsl:apply-templates select="*"/> </xsl:template> </xsl:stylesheet>
代码说明
- 输出格式设置:用
method="text"直接输出纯文本,避免HTML标签干扰预期格式。 - 层级缩进:通过
count(ancestor::*)计算当前元素的深度,每个层级对应2个空格,实现视觉上的层级对齐。 - 多级编号生成:
xsl:number的level="multiple"会遍历所有祖先层级的元素,结合count="*"统计每个层级的位置,format="1."确保每个层级的编号都以点结尾,自动生成如1.1.1.的多级格式。 - 递归处理:模板自动匹配所有元素并递归处理子节点,延续层级编号逻辑。
输出结果
1.A 1.1.C 1.1.1.E 1.1.2.F 1.1.2.1.G 1.1.2.2.H 1.2.D 2.B 2.1.I
原代码问题分析
- 原代码输出HTML结构(
<ul>、<p>标签),与预期的纯文本格式不符。 xsl:number参数设置错误:第一个模板仅统计当前层级,未关联父层级编号;第二个模板的format="1.1."是固定格式,无法适配不同层级的编号长度。- 模板匹配逻辑重复,导致元素处理流程混乱。
内容的提问来源于stack exchange,提问作者الجبل العالي
相关产品推荐
相关产品推荐

