xsl:number 是 XSLT 中用于自动生成结构化编号的指令,支持同级顺序编号、多级嵌套编号(level="multiple")、跨层级连续编号(level="any")及格式定制(format、separator、value等)。

xsl:number 是 XSLT 中专门用于生成编号的指令,特别适合给 XML 中结构化的列表(比如嵌套的 <item>、<section>、<chapter> 等)自动编号,无需手动写计数逻辑。
基础用法:简单顺序编号
最常见的是给同级元素按出现顺序编号,比如给所有 <li> 加 1、2、3…
<list> <li>苹果</li> <li>香蕉</li> <li>橙子</li> </list>对应 XSLT:
<xsl:template match="li"> <div><xsl:number/>. <xsl:apply-templates/></div> </xsl:template>
输出就是:
1. 苹果
2. 香蕉
3. 橙子
层级编号:支持多级嵌套(如 1.1、2.3.1)
用 level="multiple" + count 和 from 属性,就能实现类似文档章节的编号。
-
level="multiple":启用多级累计编号 -
count="section":只对<section>元素编号(跳过其他元素) -
from="book":从最近的<book>开始计数(限定作用范围)
<book>
<section>引言</section>
<section>第一章</section>
<section>第一节</section>
<section>第二节</section>
<section>第二章</section>
</book>
XSLT:
<xsl:template match="section"> <h2><xsl:number level="multiple" count="section" from="book"/> <xsl:apply-templates/></h2> </xsl:template>
结果会是:
1 引言
2 第一章
2.1 第一节
2.2 第二节
3 第二章
自定义格式:加前缀、分隔符、起始值
通过 format、value、separator 控制外观:
-
format="a)"→ a)、b)、c) -
format="I."→ I.、II.、III. -
separator=". "→ 把层级间分隔符改成点加空格(默认是点) -
value="position() + 10"→ 从 11 开始编号(支持 XPath 表达式)
<xsl:number format="A." value="position()" separator=". "/>
对第 3 个匹配项输出:C.
注意边界情况
<step> 不管在哪都 1→2→3),得用 level="any":
-
level="any":在整个文档中按文档顺序编号所有匹配count的节点 - 慎用:可能破坏层级语义,建议优先用
level="multiple"+ 合理from - 不匹配时(如没找到
from节点),默认输出空,可加 default="0"fallback
基本上就这些 —— 掌握 level、count、from 和 format 四个核心属性,就能覆盖绝大多数自动编号需求。










