Рис. 12.7. Создание колонок при помощи XSL-FO
Последовательности страниц и нумерация страниц
Пока я использовал один и тот же шаблон страницы для всех страниц в рассмотренных нами документах XSL-FO. Если содержимое документа занимает более одной страницы, процессор XSL-FO использует тот же шаблон страницы для всех последующих страниц.
Но вам может быть нужно использовать различные шаблоны страницы в разных местах документа. Например, первую страницу нужно отформатировать отлично от следующих. При помощи XSL-FO это можно сделать.
Каждый элемент <fo:page-sequence>, который я применял во всех примерах XSL-FO, ссылается либо на шаблон страницы, либо на элемент <fo:page-sequence-master>. При помощи элемента <fo:page-sequence-master> вы можете задать различные шаблоны страницы для последовательности страниц.
Пример pages.fo продемонстрирует вышесказанное. Я создам для первой страницы один простой шаблон страницы, «first» (первая), в котором текстовая часть смещена вниз страницы, для чего я устанавливаю свойство margin-top элемента <fo:region-body> в «50mm»:
<?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="first">
<fo:region-body margin-right="0mm" margin-left="0mm"
margin-bottom="10mm" margin-top="50mm"/>
<fo:region-after extent="10mm"/>
<fo:region-before extent="10mm"/>
</fo:simple-page-master>
.
.
.
Для всех остальных страниц я создам новый шаблон страницы, «rest» (остальные), в котором текст будет начинаться сверху страницы, для чего я устанавливаю свойство margin-top элемента <fo:region-body> в «20mm»:
<?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="first">
.
.
.
</fo:simple-page-master>
<fo:simple-page-master margin-right="25mm" margin-left="25mm"
margin-bottom="15mm" margin-top="15mm" page-width="300mm"
page-height="400mm" master-name="rest">
<fo:region-body margin-right="0mm" margin-left="0mm"
margin-bottom="10mm" margin-top="20mm"/>
<fo:region-after extent="10mm"/>
<fo:region-before extent="10mm"/>
</fo:simple-page-master>
.
.
.
Чтобы создать шаблон последовательности страниц, использующий простые шаблоны страниц «first» и «rest», я применяю элемент <fo:page-sequence-master>:
<?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="first">
.
.
.
</fo:simple-page-master>
<fo:simple-page-master margin-right="25mm" margin-left="25mm"
margin-bottom="15mm" margin-top="15mm" page-width="300mm"
page-height="400mm" master-name="rest">
.
.
.
</fo:simple-page-master>
<fo:page-sequence-master master-name="sequence">
.
.
.
</fo:page-sequence-master>
</fo:layout-master-set>
С элементом <fo:page-sequence-master> вы можете применять следующее свойство:
• master-name.
Здесь я просто назвал новую последовательность страниц «sequence» (последовательность). Я создаю шаблон последовательности страниц повторяющегося типа, и для задания имен шаблонов страниц в новой последовательности служит элемент <fo:repeatable-page-master-alternatives>:
<fo:page-sequence-master master-name="sequence">
<fо:repeatable-page-master-alternatives>
.
.
.
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
Очередное свойство элемента <fo:repeatable-page-master-alternatives> определяет, сколько раз полагается повторять последовательность:
• maximum-repeats.
Наконец, надо задать шаблоны страниц, которые будут использованы в шаблоне последовательности, при помощи элемента <fo:conditional-page-master-reference>. Этот элемент ссылается на шаблон страницы при помощи свойства master-name, и этот шаблон страницы будет использован при выполнении определенного условия. Чтобы выбрать первую страницу, нужно установить свойство page-position в «first», а для выбора остальных страниц — в «rest»:
<fo:page-sequence-master master-name="sequence">
<fo:repeatable-page-master-alternatives>
<fо:conditional-page-master-reference
master-name="first" page-position="first"/>
<fo:conditional-page-master-reference
master-name="rest" page-position="rest"/>
</fо:repeatable-page-master-alternatives>
</fo:page-sequence-master>
С элементом <fo:conditional-page-master-reference> можно применять следующие свойства:
• master-name;
• page-position;
• odd-or-even;
• blank-or-not-blank.
Теперь при создании последовательности страниц с помощью элемента <fo:page-sequence> я указываю, что процессор XSL-FO должен использовать шаблон последовательности, «sequence», который я только что создал, установив атрибут master-name элемента <fo:page-sequence>: