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

Безусловно, можно еще много сказать о 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>