1
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Radius
</fo:inline>:
2107
miles
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Density
</fo:inline>:
1
[Earth = 1]
</fo:block>
<fo:block font-family=Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Distance
</fo:inline>:
128.4
million miles
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Для того чтобы обработать planets.fo и создать форматированный документ, я воспользуюсь процессором fop от Apache XML Project. Как утверждает Apache: «FOP — первое в мире средство форматирования, управляемое форматирующими объектами XSL. Приложение Java считывает дерево форматирующих объектов и затем преобразует его в документ PDF. Дерево форматирующих объектов может быть представлено в форме документа XML (полученного на выходе такого процессора XSLT, как XT или Xalan) или может быть передано в память как документ DOM или (в случае XT) событий SAX».
Я пользуюсь fop 0.17, — последней версией процессора на момент написания книги (похоже, что новые версии выходят практически ежемесячно). Процессор fop можно бесплатно загрузить с http://xml.apache.org/fop. Пакет загрузки fop включает три необходимых для работы файла JAR: fop.jar, w3c.jar и xerces.jar, которые нужно включить в classpath (добавьте правильные пути к этим файлам JAR в соответствии с требованиями вашей системы):
С:\>set classpath=.;fop.jar;xerces.jar;w3c.jar
Для преобразования planets.fo в planets.pdf служит класс fop org.apache.fop.apps.CommandLine, которому в командной строке нужно передать имя входного документа, planets.fo, и имя выходного, planets.pdf:
C:\>java org.apache.fop.apps.CommandLine planets.fo planets.pdf
Вот и все; окончательный результат, planets.pdf, в средстве просмотра Adobe Acrobat Reader вы увидите, если вернетесь к рис. 11.1.
Теперь вы видели, как выполняется процедура в общем; давайте перейдем к деталям и посмотрим, как создаются документы XSL-FO. Чтобы подробно все рассмотреть, я собираюсь взять за основу листинг 11.2, таблицу стилей XSLT, создающую planets.fo.
СОЗДАНИЕ ДОКУМЕНТОВ XSL-FO С НУЛЯ
Заметьте, что не обязательно создавать таблицу стилей для преобразования документов XSL в форму XSL-FO. Я мог бы написать planets.fo так, как показано в листинге 11.3, с нуля, не прибегая к таблицам стилей XSLT. Но такой способ, как правило, годится только для коротких документов XML. Документы с форматированием XSL-FO становятся весьма длинными очень быстро (сравните длину planets.xml с planets.fo), поэтому для создания документов XSL-FO практически всегда применяйте таблицы стилей XSLT (хотя некоторые примеры в следующей главе достаточно коротки для того, чтобы написать их непосредственно при помощи XSL-FO).
Создание корня документа: <fo:root>
Первый форматирующий документ, который мы рассмотрим, — это <fo:root>, узел документа любого документа XSL-FO.
Детьми форматирующего объекта <fo:root> являются единственный форматирующий объект <fo:layout-master-set> и последовательность из одного или нескольких элементов <fo:page-sequence>. Форматирующий объект <fo:layout-master-set> содержит все используемые в документе шаблоны, при помощи которых вы управляете созданием каждой страницы. Каждый объект <fo:page-sequence> представляет собой последовательность страниц, отформатированных нужных вам способом. Например, каждая глава в книге может быть сформирована из своей собственной последовательности страниц, и каждой последовательности страниц вы можете задать одни и те же верхний и нижний колонтитулы: «Глава 5: Незнакомец появляется снова».
На первом шаге в таблице стилей XSLT, преобразующей planets.xml, я выбираю узел документа <PLANETS> и заменяю его на элемент <fo:root>, объявляющий префикс пространства имен «fo»:
<?xml version="1.0"?>
<xsclass="underline" stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<xsclass="underline" template match="PLANETS">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
.
.
.
Элемент <fo:root> может содержать и схемы шаблонов, и последовательности страниц. Сначала я опишу объект <fo:layout-master-set>.
Создание схемы набора шаблонов: <fo:layout-master-set>
Шаблоны (master) могут быть определены для страниц, последовательностей страниц и областей. Элемент <fo:layout-master-set> содержит все используемые в документе шаблоны, включая шаблоны последовательностей (sequence master), страниц (page master) и областей (region master).
Шаблоны страниц формируют отдельные страницы, шаблоны последовательностей страниц — последовательности страниц; шаблоны областей позволяют форматировать определенные области страницы. В следующем примере я создам единственный шаблон при помощи <fo:simple-page-master>.