如何在XSL-FO(XEP处理器)中隐藏章节首页的页眉?
解决XSL-FO章节首页隐藏页眉的问题
要实现每个章节首页隐藏页眉的需求,核心思路是为章节首页和后续页面分别定义不同的页面主模板,并通过页面序列主模板来自动切换它们。下面是具体的实现步骤和修改后的代码:
1. 定义两个页面主模板
首先创建两个fo:simple-page-master:一个用于章节首页(隐藏页眉),一个用于章节内的其他页面(显示页眉):
<!-- 章节首页模板:隐藏页眉 --> <fo:simple-page-master master-name="page-recto-chapter-start" page-height="29.7cm" page-width="21cm" margin-top="3cm" margin-bottom="2cm" margin-left="3cm" margin-right="1.5cm"> <fo:region-body region-name="xsl-region-body"/> <!-- 将页眉区域设为不可见或高度为0,避免占用空间 --> <fo:region-before region-name="xsl-region-before" extent="0pt" visibility="hidden"/> <fo:region-after region-name="xsl-region-after" extent="12pt" padding-top="2cm"/> </fo:simple-page-master> <!-- 普通页面模板:保留原有页眉设置 --> <fo:simple-page-master master-name="page-recto" page-height="29.7cm" page-width="21cm" margin-top="3cm" margin-bottom="2cm" margin-left="3cm" margin-right="1.5cm"> <fo:region-body region-name="xsl-region-body"/> <fo:region-before region-name="xsl-region-before" extent="12pt" padding="2cm" /> <fo:region-after region-name="xsl-region-after" extent="12pt" padding-top="2cm"/> </fo:simple-page-master>
2. 创建页面序列主模板控制切换
用fo:page-sequence-master定义规则:章节首页使用无页眉模板,后续页面使用普通模板:
<fo:page-sequence-master master-name="chapter-page-sequence"> <fo:repeatable-page-master-alternatives> <!-- 章节的第一页匹配此规则 --> <fo:conditional-page-master-reference master-reference="page-recto-chapter-start" page-position="first"/> <!-- 章节内的其他页面匹配此规则 --> <fo:conditional-page-master-reference master-reference="page-recto" page-position="rest"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master>
3. 修改章节模板,每个章节作为独立页面序列
为了让每个章节都能触发自己的首页规则,需要把每个章节包装成独立的fo:page-sequence,而不是整个语料库用一个序列:
<xsl:template match="chapter"> <fo:page-sequence master-reference="chapter-page-sequence"> <!-- 页眉静态内容(仅在非首页显示) --> <fo:static-content flow-name="xsl-region-before"> <fo:block text-align="center" font-family="Times" font-size="8pt" font-style="normal" margin-bottom="1cm"> <fo:retrieve-marker retrieve-class-name="header-chapter-title" retrieve-position="first-starting-within-page" retrieve-boundary="page-sequence"/> </fo:block> </fo:static-content> <!-- 页脚静态内容(所有页面显示) --> <fo:static-content flow-name="xsl-region-after"> <fo:block text-align="center" font-family="Times" font-size="8pt" font-style="normal"> <fo:page-number/> </fo:block> </fo:static-content> <!-- 章节内容流 --> <fo:flow flow-name="xsl-region-body" font-family="Times" font-weight="normal" font-size="10pt" space-before="10pt" space-after="10pt" end-indent="120pt"> <xsl:apply-templates/> </fo:flow> </fo:page-sequence> </xsl:template>
4. 保留原章节标题模板
你的章节标题模板不需要大改,继续保留page-break-before="always"和fo:marker设置即可:
<xsl:template match="chapter-title"> <fo:block text-align="left" margin-top="2cm" margin-bottom="2cm" font-family="Times" font-size="16pt" page-break-before="always"> <fo:marker marker-class-name="header-chapter-title"> <xsl:value-of select="."/> </fo:marker> <xsl:apply-templates/> </fo:block> </xsl:template>
原理说明
- 每个章节作为独立的
page-sequence,其第一页会被page-position="first"匹配,使用隐藏页眉的模板; - 章节内的后续页面会被
page-position="rest"匹配,使用显示页眉的模板; - 页眉中的
fo:retrieve-marker会正常提取章节标题,仅在非首页显示。
这个方案在XEP处理器下完全可行,符合XSL-FO 1.0/1.1标准。
内容的提问来源于stack exchange,提问作者jbrehr
相关产品推荐
相关产品推荐

