You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Apache FOP的XML 1.0 XSLT多级列表编号异常问题

解决XSLT 1.0 + Apache FOP多级列表编号重置问题

问题根源

你的问题出在步骤编号未关联父级Procedure的全局序号,当前代码仅在单个Procedure内部对Step计数,导致每个Procedure的步骤都从1.1重新开始。

解决方案

通过调整<xsl:number>的参数,让Step编号继承Procedure的全局序号,同时支持嵌套Step的层级编号(如1.1、1.1.a、2.1等)。以下是适配Apache FOP的完整XSLT示例:

核心XSLT代码

<!-- 根模板匹配ProcedureList -->
<xsl:template match="ProcedureList">
  <fo:block>
    <xsl:apply-templates select="Procedure"/>
  </fo:block>
</xsl:template>

<!-- 处理每个Procedure,生成全局编号 -->
<xsl:template match="Procedure">
  <fo:block font-weight="bold" margin-top="1em">
    <xsl:number count="Procedure" level="single"/>. <xsl:value-of select="@title"/>
  </fo:block>
  
  <!-- 一级步骤列表容器 -->
  <fo:list-block 
    provisional-distance-between-starts="2cm" 
    provisional-label-separation="0.5cm"
    margin-left="1em">
    <xsl:apply-templates select="Steps/Step"/>
  </fo:list-block>
</xsl:template>

<!-- 递归处理嵌套Step,生成多级编号 -->
<xsl:template match="Step">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>
        <!-- 关键:跨Procedure和Step的多级计数,格式为"1.1.a" -->
        <xsl:number 
          count="Procedure | Step" 
          level="multiple" 
          format="1.1.a" 
          from="ProcedureList"/>
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block><xsl:value-of select="@text"/></fo:block>
      
      <!-- 递归处理子步骤,缩进更大 -->
      <xsl:if test="Step">
        <fo:list-block 
          provisional-distance-between-starts="3cm" 
          provisional-label-separation="0.5cm"
          margin-top="0.5em">
          <xsl:apply-templates select="Step"/>
        </fo:list-block>
      </xsl:if>
    </fo:list-item-body>
  </fo:list-item>
</xsl:template>

关键参数说明

  • <xsl:number count="Procedure | Step">:指定要参与计数的节点类型,将Procedure的全局序号纳入Step的编号前缀。
  • level="multiple":启用多级编号,自动识别节点层级(Procedure为一级,Step为二级、三级等)。
  • format="1.1.a":定义各层级的编号格式,一级用数字,二级用数字,三级用小写字母,可根据需求调整(如1.A.i)。
  • from="ProcedureList":从根节点开始计数,确保所有Procedure的序号全局连续,不会在新的Procedure中重置。

适配Apache FOP的注意事项

  • 使用fo:list-block和fo:list-item构建列表,这是FOP支持的标准列表结构。
  • 通过provisional-distance-between-starts控制不同层级列表的缩进,确保嵌套层级清晰。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:22:46