基于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
相关产品推荐
相关产品推荐

