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

