和荣笔记 - XSL-FO 与 XHTML
杨和荣, 版本 2.03, 2007年

XSL-FO - References and Links

Part:   1  2 

(Continued from previous part...)

XSL-FO Example - complex_page.fo

Let's apply what we have learned so far to create a more complex XSL-FO example file to illustrate how to handle some advanced formatting features like: page numbering, hyper links, table of contents, etc.

<?xml version="1.0" encoding="utf-8"?>
<!-- complex_page.fo
     Copyright (c) 2002 by Dr. Herong Yang
-->
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <fo:layout-master-set>
  <fo:simple-page-master master-name="page" margin="1.0in">
   <fo:region-before region-name="header" extent="0.6in" 
    background-color="#cfcfcf" display-align="after"/>
   <fo:region-after region-name="footer" extent="0.6in" 
    background-color="#cfcfcf" display-align="before"/>
   <fo:region-body region-name="body" 
    margin-top="0.8in" margin-bottom="0.8in" 
    background-color="#cfcfcf"/>
  </fo:simple-page-master>
 </fo:layout-master-set>
 <fo:page-sequence master-reference="page">
  <fo:static-content flow-name="header"
   font-family="sans-serif" font-size="18pt">
   <fo:block border-bottom-width="1px" border-bottom-style="solid">
    <fo:list-block>
     <fo:list-item>
      <fo:list-item-label>
       <fo:block font-weight="normal" text-align="start">
        Document Title
       </fo:block>
      </fo:list-item-label>
      <fo:list-item-body>
       <fo:block font-weight="normal" text-align="end">
        <fo:page-number/>
       </fo:block>
      </fo:list-item-body>
     </fo:list-item>
    </fo:list-block>
   </fo:block>
  </fo:static-content>
  <fo:static-content flow-name="footer"
   font-family="sans-serif" font-size="18pt" font-style="italic">
   <fo:block border-top-width="1px" border-top-style="solid" 
   text-align="center">
    <fo:retrieve-marker retrieve-class-name="chapter_title"/>
   </fo:block>
  </fo:static-content>
  <fo:flow flow-name="body"
   font-family="serif" font-size="18pt" font-style="normal"
   font-weight="normal">
   <fo:block id="toc" space-before="12pt" padding-after="6pt" 
    font-size="150%" font-weight="bold"
    background-color="#afafaf">
    <fo:marker marker-class-name="chapter_title">
     Table of Contents
    </fo:marker>
    <fo:block>
     Table of Contents
    </fo:block>
   </fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
    <fo:block text-align-last="justify">
 <fo:basic-link internal-destination="intro" color="#0000ff">
 Chapter 1. Introduction 
 <fo:leader leader-pattern="dots"/> 
 <fo:page-number-citation ref-id="intro"/>
 </fo:basic-link>
    </fo:block>
    <fo:block text-align-last="justify">
 <fo:basic-link internal-destination="conclusion" color="#0000ff">
 Chapter 2. Conclusion 
 <fo:leader leader-pattern="dots"/> 
 <fo:page-number-citation ref-id="conclusion"/>
 </fo:basic-link>
    </fo:block>
    <fo:block text-align-last="justify">
 <fo:basic-link internal-destination="index" color="#0000ff">
 Index 
 <fo:leader leader-pattern="dots"/> 
 <fo:page-number-citation ref-id="index"/>
 </fo:basic-link>
    </fo:block>
   </fo:block>
   <fo:block id="intro" space-before="12pt" padding-after="6pt" 
    font-size="150%" font-weight="bold" break-before="page"
    background-color="#afafaf">
    <fo:marker marker-class-name="chapter_title" font-size="18pt">
     Chapter 1. Introduction
    </fo:marker>
    <fo:block>
     Chapter 1. Introduction
    </fo:block>
   </fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
Introductin text goes here. 
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
   </fo:block>
   <fo:block padding-before="12pt" padding-after="3pt"
    font-weight="bold">Section 1.1 What is Bla</fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
Define what is Bla. 
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
   </fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
Further explanation of what is Bla. 
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
   </fo:block>
   <fo:block padding-before="12pt" padding-after="3pt"
    font-weight="bold">Section 1.2 History of Bla</fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
Brief history of Bla. 
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
   </fo:block>
   <fo:block id="conclusion" space-before="12pt" padding-after="6pt"
    font-size="150%" font-weight="bold" break-before="page"
    background-color="#afafaf">
    <fo:marker marker-class-name="chapter_title">
     Chapter 2. Conclusion
    </fo:marker>
   </fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
Conclusion text goes here. 
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
Bla bla bla. Bla bla bla. Bla bla bla.
See Chapter 1 on page <fo:page-number-citation ref-id="intro"/> 
for details.
   </fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
 See 
 <fo:basic-link external-destination="url('www.bla.com')"
  color="#0000ff">
  Bla Web site
 </fo:basic-link>
 for more information.
   </fo:block>
   <fo:block id="index" space-before="12pt" padding-after="6pt" 
    font-size="150%" font-weight="bold" break-before="page"
    background-color="#afafaf">
    <fo:marker marker-class-name="chapter_title">
     Index
    </fo:marker>
   </fo:block>
   <fo:block padding-before="9pt" padding-after="3pt" 
    text-indent="0.5in" text-align="justify">
    <fo:block>
Index entries go here.
    </fo:block>
   </fo:block>
  </fo:flow>
 </fo:page-sequence>
</fo:root>

Notes about the PDF output generated by this code with FOP:

  • Some how the page number of the last entry of the table of contents is not showing. Could be a bug in FOP.
  • "retrieve-marker" retrieves not only the text of the marked formatting objects, but also the formatting properties. This is why the chapter titles in the footer area are so large and in the wrong font.

Part:   1  2 

杨和荣,修改于2007年
和荣笔记 - XSL-FO 与 XHTML - XSL-FO - References and Links