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

XSL FO多页序列页码异常:循环生成Itemisation时id重复问题求助

XSL FO生成PDF/AFP时的重复ID与页码问题处理

问题描述

我用XSL FO生成PDF和AFP文件,现有三个页序列,添加第三个页序列后出现页码问题(此前一切正常)。因为需要为每个Itemisation section生成新页面,所以使用了<xsl:for-each>,但现在报错提示id='end-item'不唯一,请问该如何处理此页码问题?忽略语法错误即可。

我的XML结构

<Statement>
 <name>
 <address>
 <city>
 <Details>
  <Detail>
   <T1>
    <T2>
    <T3>
  </Detail>
 </Details>
 <Details>
  <Detail>
   <T1>
    <T2>
     <T3>
   <Detail>
   <Itemisation>
    <T1>
    <T1name>
    <time>
   </Itemisation>
  <Details>
 </Statement>

我的样式表

<!-- 1st page sequence --> 
<fo:page-sequence master-reference="A4" id="first">
 <fo:flow>
 <fo:block  font-size="12pt" font-weight="bold" text-align="justify">
   <xsl:choose>
     <xsl:when test="Details/Itemisations">
         <fo:inline text-align="justify" font-size="7pt" 
          font-weight="bold"><fo:leader leader-length="0.7in" leader-pattern="space" />
           page <fo:page-number/> of <fo:page-number-citation ref-id="end-item"/> 
          </fo:inline>
          </xsl:when>
        <xsl:otherwise>
             <fo:inline text-align="justify" font- 
               size="7pt" font-weight="bold"><fo:leader leader-length="0.7in" leader- 
                 pattern="space" />
                  page <fo:page-number/> of <fo:page-number-citation ref-id="end"/> 
               </fo:inline>
            </xsl:otherwise>
                  </xsl:choose>
              </fo:block>
         </fo:flow>
       </fo:page-sequence>

<!-- 2nd page sequence-->
<fo:page-sequence master-reference="A4-first" force-page-count="no-force" >
 <fo:flow>
 <fo:block  font-size="12pt" font-weight="bold" text-align="justify">
   <xsl:choose>
     <xsl:when test="Details/Itemisations">
         <fo:inline text-align="justify" font-size="7pt" 
          font-weight="bold"><fo:leader leader-length="0.7in" leader-pattern="space" />
           page <fo:page-number/> of <fo:page-number-citation ref-id="end-item"/> 
          </fo:inline>
          </xsl:when>
        <xsl:otherwise>
             <fo:inline text-align="justify" font- 
               size="7pt" font-weight="bold"><fo:leader leader-length="0.7in" leader- 
                 pattern="space" />
                  page <fo:page-number/> of <fo:page-number-citation ref-id="end"/> 
               </fo:inline>
            </xsl:otherwise>
                  </xsl:choose>
              </fo:block>
         </fo:flow>
         <fo:block id="end"/>
       </fo:page-sequence>

     <!--3rd page sequence-->
      <xsl:for-each select="Details/Itemisations">
      <fo:page-sequence master-reference="A4-first-next" force-page-count="no-force" >
      <fo:flow>
      <fo:block>
        <fo:inline text-align="justify" font-size="7pt" 
         font-weight="bold"><fo:leader  leader-length="1.1in" leader-pattern="space" />
          page <fo:page-number/> of <fo:page-number-citation-last ref-id="end-item"/>
         </fo:inline>
       </fo:block>
       
       </fo:flow>
      <fo:block id="end-item"/>
      </fo:page-sequence>
      </xsl:for-each>

解决方案

1. 修复重复ID问题

<xsl:for-each>循环会为每个Itemisation生成带有id="end-item"的块,违反ID唯一性要求。给每个ID添加唯一标识,比如结合当前节点的位置:

<!-- 修改第三个页序列中的id定义 -->
<fo:block>
  <xsl:attribute name="id">end-item-<xsl:value-of select="position()"/></xsl:attribute>
</fo:block>

这样循环生成的ID会是end-item-1、end-item-2...彻底避免重复。

2. 调整页码引用逻辑

根据实际需求选择对应方案:

  • 需求1:前两个页序列显示所有Itemisation页的总页数
    给最后一个Itemisation页序列单独设置唯一ID,比如final-end-item,再修改前两个页序列的引用:
    <!-- 在循环中判断是否为最后一个Itemisation -->
    <xsl:for-each select="Details/Itemisations">
      <fo:page-sequence master-reference="A4-first-next" force-page-count="no-force" >
        <!-- ... 其他内容 ... -->
        <fo:block>
          <xsl:choose>
            <xsl:when test="position() = last()">
              <xsl:attribute name="id">final-end-item</xsl:attribute>
            </xsl:when>
            <xsl:otherwise>
              <xsl:attribute name="id">end-item-<xsl:value-of select="position()"/></xsl:attribute>
            </xsl:otherwise>
          </xsl:choose>
        </fo:block>
      </fo:page-sequence>
    </xsl:for-each>
    <!-- 前两个页序列中的引用改为 -->
    <fo:page-number-citation ref-id="final-end-item"/>
    
  • 需求2:每个Itemisation页序列独立显示自身页码范围
    修改第三个页序列的页码引用,指向当前循环生成的唯一ID:
    <fo:inline text-align="justify" font-size="7pt" font-weight="bold">
      <fo:leader leader-length="1.1in" leader-pattern="space" />
      page <fo:page-number/> of <fo:page-number-citation-last ref-id="end-item-{position()}"/>
    </fo:inline>
    

3. 可选:统一文档连续页码

如果需要整个文档页码连续递增,给每个页序列设置initial-page-number="auto",或者通过page-sequence-master配置页码承接逻辑,确保后续页序列延续前一个的页码计数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:57:01