Форматирование документа XML
Чтобы посмотреть, как XSL-FO может форматировать данные XML, я воспользуюсь planets.xml (листинг 11.1).
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='planets.xsl'?>
<PLANETS>
<PLANET COLOR='RED'>
<NAME>Mercury</NAME>
<MASS UNITS='(Earth = 1)'>.0553</MASS>
<DAY UNITS='days'>58.65</DAY>
<RADIUS UNITS='miles'>1516</RADIUS>
<DENSITY UNITS='(Earth = 1)'>.983</DENSITY>
<DISTANCE UNITS='million miles'>43.4</DISTANCE><!--B перигелии-- >
</PLANET>
<PLANET COLOR='WHITE'>
<NAME>Venus</NAME>
<MASS UNITS='(Earth = 1)'>.815</MASS>
<DAY UNITS='days'>116.75</DAY>
<RADIUS UNITS='miles'>3716</RADIUS>
<DENSITY UNITS='(Earth = 1)'>.943</DENSITY>
<DISTANCE UNITS='million miles'>66.8</DISTANCE><!--B перигелии-- >
</PLANET>
<PLANET COLOR='BLUE'>
<NAME>Earth</NAME>
<MASS UNITS='(Earth = 1)'>1</MASS>
<DAY UNITS='days'>1</DAY>
<RADIUS UNITS='miles'>2107</RADIUS>
<DENSITY UNITS='(Earth = 1)'>1</DENSITY>
<DISTANCE UNITS='million miles'>128.4</DISTANCE><!--B перигелии-- >
</PLANET>
</PLANETS>
В этом первом примере я создам таблицу стилей XSLT для форматирования файла planets.xml
и преобразования его в planets.fo
, использующую форматирующие объекты для задания шрифтов, стилей и цветов. Затем я воспользуюсь процессором fop и преобразую planets.fo
в файл planets.pdf
, который показан на рис. 11.1.

Рис. 11.1. Документ PDF, созданный при помощи форматирующих объектов
Как видно на рис. 11.1, в нашем первом примере я применил средства форматирования текста: установку шрифта, подчеркивание текста, выделение текста курсивом и даже установка цвета текста. (Хотя этого и не видно на рис. 11.1, заголовок «The Planets Table» выделен светло-голубым цветом.)
Первый шаг при создании документа на рис. 11.1 — применить таблицу стилей XSLT для преобразования planets.xml
в planets.fo
.
Преобразование в XSL-FO при помощи таблицы стилей XSLT
В этой главе я создам таблицу стилей для преобразования planets.xml
в planets.fo
. Я буду создавать таблицу шаг за шагом; для справки я приведу ее окончательный вид (листинг 11.2).
<?xml version='1.0'?>
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:fo='http://www.w3.org/1999/XSL/Format'
version='1.0'>
<xsl:template match='PLANETS'>
<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
<fo:layout-master-set>
<fo:simple-page-master master-name='page'
page-height='400mm' page-width='300mm'
margin-top='10mm' margin-bottom='10mm'
margin-left='20mm' margin-right='20mm'>
<fo:region-body
margin-top='0mm' margin-bottom='10mm'
margin-left='0mm' margin-right='0mm'/>
<fo:region-after extent='10mm'/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-name='page'>
<fo:flow flow-name='xsl-region-body'>
<fo:block font-weight='bold' font-size='36pt'
line-height='48pt' font-family='Times' color='blue'>
The Planets Table
</fo:block>
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match='PLANET/NAME'>
<fo:block font-weight='bold' font-size='28pt'
line-height='48pt' font-family='Times'
font-style='italic'>
Planet:
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match='PLANET/MASS'>
<fo:block font-size='24pt' line-height='32pt'