XSL-FO中if条件判断页码控制页眉图片显隐失效问题求助
解决XSL-FO中仅第一页页眉显示图片的问题
问题分析
你当前的代码逻辑错误在于:用<xsl:variable>包裹<fo:page-number>来获取页码并做判断是行不通的。<fo:page-number>是PDF格式化阶段才会生成的输出对象,而XSL变量是在样式表编译/初始处理阶段就被求值的,两者的执行时机不匹配,导致$vPageNumber==1的条件永远无法触发,所以图片在所有页面都不显示。
正确实现方案
这里提供两种可靠的解决方式:
方案1:直接使用FO处理器的页码函数进行判断
针对支持扩展函数的XSL-FO处理器(比如Apache FOP),可以直接在<xsl:if>的test属性中调用页码相关函数,跳过错误的变量赋值步骤:
<xsl:if test="fo:page-number() = 1"> <fo:block text-align="right" margin-right="24px"> <fo:external-graphic content-width="20mm" src="url(D:/Atlassian/images/Turkak.gif)" /> </fo:block> </xsl:if>
注:部分处理器的函数写法可能为page-number(),无需前缀,可根据你使用的FO工具调整。
方案2:使用多页面主模板(更规范的FO实现方式)
通过定义不同的页面主模板,给第一页和其他页面分别指定带图片/不带图片的页眉,这是XSL-FO中处理页面差异化的标准方式:
<!-- 1. 定义第一页的页面模板(带图片页眉) --> <fo:simple-page-master master-name="page-first" page-width="210mm" page-height="297mm"> <fo:region-before extent="15mm"> <fo:block text-align="right" margin-right="24px"> <fo:external-graphic content-width="20mm" src="url(D:/Atlassian/images/Turkak.gif)" /> </fo:block> </fo:region-before> <fo:region-body margin-top="15mm" margin-bottom="15mm" /> </fo:simple-page-master> <!-- 2. 定义其他页面的页面模板(无图片页眉) --> <fo:simple-page-master master-name="page-rest" page-width="210mm" page-height="297mm"> <fo:region-before extent="15mm"> <!-- 这里可以放其他页面的页眉内容,留空则无页眉 --> </fo:region-before> <fo:region-body margin-top="15mm" margin-bottom="15mm" /> </fo:simple-page-master> <!-- 3. 配置页面序列,指定第一页和后续页的模板映射 --> <fo:page-sequence> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference master-reference="page-first" page-position="first" /> <fo:conditional-page-master-reference master-reference="page-rest" page-position="rest" /> </fo:repeatable-page-master-alternatives> <!-- 文档内容流 --> <fo:flow flow-name="xsl-region-body"> <!-- 你的文档内容写在这里 --> </fo:flow> </fo:page-sequence>
额外检查项
- 确认图片路径
D:/Atlassian/images/Turkak.gif是FO处理器能够访问到的绝对路径,或者改为相对路径(相对于样式表所在目录) - 如果你使用的是特定的FO处理器(如RenderX XEP),可查阅其文档确认页码判断的语法细节
内容的提问来源于stack exchange,提问作者hakanb
相关产品推荐
相关产品推荐

