Безусловно, можно еще много сказать о XSL-FO. В следующей главе мы рассмотрим работу со списками, размещение, колонки, последовательности страниц и другие элементы.
Глава 12 Документы XSL-FO
В этой главе мы продолжим работу с XSL-FO. Здесь мы рассмотрим работу со списками, рисунками и колонками, размещение текста, создание многостраничных последовательностей и другое. По прочтении этой главы вы усвоите основы работы с XSL-FO — по крайней мере, с той частью, которая реализована в современном программном обеспечении. Я начну главу со списков XSL-FO.
Создание списков XSL-FO
Как мы видели в главе 11, таблицы XSL-FO работают во многом так же, как в HTML, и это в той же мере относится к спискам. Как и в HTML, список XSL выводит вертикальный список элементов. Для создания списков служат четыре элемента XSL-FO:
• <fo:list-block>;
• <fo:list-item>;
• <fo:list-item-label>;
• <fo:list-item-body>.
Весь список заключается в элемент <fo:list-block>, и каждый элемент списка — в элемент <fo:list-item>. Для создания подписи к элементу списка служит элемент <fo:list-item-label>, а для вставки данных в каждый элемент списка — элемент <fo:list-item-body>.
Пример lists.xsl (листинг 12.1) преобразует planets.xml в список формата XSL-FO, в котором каждый элемент списка отображает название планеты.
Листинг 12.1. lists.xsl<?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: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-size="24pt">The Planets Table</fo:block>
<fo:list-block provisional-distance-between-starts="15mm"
provisional-label-separation="5mm">
<xsclass="underline" apply-templates/>
</fo:list-block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsclass="underline" template>
<xsclass="underline" template match="PLANET">
<fo:list-item line-height="20mm">
<fo:list-item-label>
<fo:block font-family="sans-serif" font-size="36pt">
<xsclass="underline" number/>
<xsclass="underline" text>. </xsclass="underline" text>
</fo:block>
</fo:list-item-label>
<xsclass="underline" apply-templates/>
</fo:list-item>
</xsclass="underline" template>
<xsclass="underline" template match="NAME">
<fo:list-item-body>
<fo:block font-family="sans-serif" font-size="36pt">
<xsclass="underline" value-of select='.'/>
</fo:block>
</fo:list-item-body>
</xsclass="underline" template>
<xsclass="underline" template match="MASS">
</xsclass="underline" template>
<xsclass="underline" template match="RADIUS">
</xsclass="underline" template>
<xsclass="underline" template match="DENSITY">
</xsclass="underline" template>
<xsclass="underline" template match="DAY">
</xsclass="underline" template>
<xsclass="underline" template match="DISTANCE">
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Вот результирующий документ XSL-FO, lists.fo (листинг 12.2).
Листинг 12.2. lists.fo<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master margin-right="20mm" margin-left="20mm"
margin-bottom="10mm" margin-top="10mm" page-width="300mm"
page-height="400mm" master-name="page">
<fo:region-body margin-right="0mm" margin-left="0mm"
margin-bottom="10mm" margin-top="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-size="24pt">The Planets Table</fo:block>
<fo:list-block provisional-label-separation="5mm"
provisional-distance-between-starts="15mm">
<fo:list-item line-height="20mm">
<fo:list-item-label>
<fo:block font-size="36pt" font-family="sans-serif">
1.
</fo:block>
</fo:list-item-label>
<fo:list-item-body>
<fo:block font-size="36pt" font-family="sans-serif">
Mercury
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item line-height="20mm">
<fo:list-item-label>
<fo:block font-size="36pt" font-family="sans-serif">
2.
</fo:block>
</fo:list-item-label>
<fo:list-item-body>
<fo:block font-size="36pt" font-family="sans-serif">
Venus
</fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item line-height="20mm">
<fo:list-item-label>
<fo:block font-size="36pt" font-family="sans-serif">
3.
</fo:block>
</fo:list-item-label>