XSLT的xsl:number怎么给列表自动编号

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

xsl:number 是 XSLT 中专门用于生成编号的指令,特别适合给 XML 中结构化的列表(比如嵌套的

等)自动编号,无需手动写计数逻辑。

基础用法:简单顺序编号

最常见的是给同级元素按出现顺序编号,比如给所有

  • 加 1、2、3…

    示例 XML:
    
      
  • 苹果
  • 香蕉
  • 橙子
  • 对应 XSLT:
    
      . 
    

    输出就是:
    1. 苹果
    2. 香蕉
    3. 橙子

    层级编号:支持多级嵌套(如 1.1、2.3.1)

    level="multiple" + countfrom 属性,就能实现类似文档章节的编号。

    • level="multiple":启用多级累计编号
    • count="section":只对
      元素编号(跳过其他元素)
    • from="book":从最近的 开始计数(限定作用范围)
    XML 示例:
    
      
    引言
    第一章
    第一节
    第二节
    第二章
    XSLT:
    
      

    结果会是:
    1 引言
    2 第一章
    2.1 第一节
    2.2 第二节
    3 第二章

    自定义格式:加前缀、分隔符、起始值

    通过 formatvalueseparator 控制外观:

    • format="a)" → a)、b)、c)
    • format="I." → I.、II.、III.
    • separator=". " → 把层级间分隔符改成点加空格(默认是点)
    • value="position() + 10" → 从 11 开始编号(支持 XPath 表达式)
    例如:

    对第 3 个匹配项输出:C.

    意边界情况

    默认只统计“当前节点在匹配路径中的位置”,不是全局计数。如果想跨不同父节点连续编号(比如所有 不管在哪都 1→2→3),得用 level="any"

    • level="any":在整个文档中按文档顺序编号所有匹配 count 的节点
    • 慎用:可能破坏层级语义,建议优先用 level="multiple" + 合理 from
    • 不匹配时(如没找到 from 节点), 默认输出空,可加 default="0" fallback

    基本上就这些 —— 掌握 levelcountfromformat 四个核心属性,就能覆盖绝大多数自动编号需求。