使用fo:marker/retrieve-marker实现页眉页脚可变图片遇src无效问题求解
解决随章节变化的页眉图片问题
直接在<xsl:attribute>中嵌套<fo:retrieve-marker>会导致解析错误,生成无效的src值——因为retrieve-marker是FO元素,不能直接作为属性值的嵌套内容。正确的做法是先通过retrieve-marker获取图片文件名,再动态生成external-graphic的src属性。
步骤1:在章节开头定义标记
为每个章节添加fo:marker,存储对应页眉图片的文件名:
<!-- 第1章内容 --> <fo:block> <fo:marker marker-class-name="header-image">1.png</fo:marker> <fo:block font-size="16pt" font-weight="bold">第1章</fo:block> <fo:block>第1章的正文内容...</fo:block> </fo:block> <!-- 第2章内容 --> <fo:block> <fo:marker marker-class-name="header-image">2.png</fo:marker> <fo:block font-size="16pt" font-weight="bold">第2章</fo:block> <fo:block>第2章的正文内容...</fo:block> </fo:block>
步骤2:在页眉中动态加载图片
在静态页眉区域,先通过变量捕获标记的内容,再将其作为src属性值:
<fo:static-content flow-name="xsl-region-before"> <fo:block text-align="center"> <!-- 捕获当前章节对应的图片文件名 --> <xsl:variable name="current-header-img"> <fo:retrieve-marker marker-class-name="header-image" retrieve-position="first-starting-with-page" retrieve-boundary="page-sequence"/> </xsl:variable> <!-- 加载图片 --> <fo:external-graphic src="{$current-header-img}" height="2cm"/> </fo:block> </fo:static-content>
参数说明
marker-class-name:标记的分类名,确保页眉检索的标记和章节定义的标记一致。retrieve-position="first-starting-with-page":获取当前页面起始位置对应的标记——这会让第2页(包含第1章结尾和第2章开头)仍使用第1章的图片,只有完全属于第2章的第3页才加载2.png,符合需求。retrieve-boundary="page-sequence":限制在当前页面序列内检索标记,避免跨序列干扰。
关键注意点
- 标记中仅存放纯文本文件名,不要嵌套其他FO元素,确保变量能捕获到干净的字符串值。
- 不同XSL-FO处理器(如Apache FOP、RenderX XEP)对标记检索的细节处理可能略有差异,若出现异常可调整
retrieve-position参数(例如改用last-including-carryover)。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

