Выбрать главу

Рис. 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>: