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

  <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>

  <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>

  <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 — мы посмотрим, как ее создавать, в главе 11 — для преобразования planets.xml так, чтобы он использовал форматирующие объекты. Затем при помощи процессора FOP я преобразую новый документ в файл PDF. Мы также посмотрим, как форматированный документ выглядит в Adobe Acrobat.

Таблица стилей XSLT

В листинге 1.8 приведена таблица стилей planetsPDF.xcl, которая берет данные из planets.xml и форматирует их в файл PDF, planets.pdf. В этом случае для текста я использую крупный шрифт — 36 пунктов.

Листинг 1.8. Преобразование XML-XSL-FO

<?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>

   </fо:layout-master-set>

   <fo:page-sequence master-name="page">

    <fo:flow flow-name="xsl-region-body">

     <xsclass="underline" apply-templates/>

    </fo:flow>

   </fo:page-sequence>

  </fo:root>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET/NAME">

  <fo:block

   font-weight="bold" font-size="36pt" line-height="48pt"

   font-family="sans-serif">

   Name:

   <xsclass="underline" apply-templates/>

  </fo:block>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET/MASS">

  <fo:block

   font-size="36pt" line-height="48pt"

   font-family="sans-serif">

   Mass (Earth = 1):

   <xsclass="underline" apply-templates/>

  </fo:block>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET/DAY">

  <fo:block

   font-size="36pt" line-height="48pt"

   font-family="sans-serif">

   Day (Earth = 1):

   <xsclass="underline" apply-templates/>

  </fo:block>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET/RADIUS">

  <fo:block

   font-size="36pt" line-height="48pt"

   font-family="sans-serif">

   Radius (in miles):

   <xsclass="underline" apply-templates/>

  </fo:block>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET/DENSITY">

  <fo:block

   font-size="36pt" line-height="48pt"

   font-family="sans-serif">

   Density (Earth = 1):

   <xsclass="underline" apply-templates/>

  </fo:block>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET/DISTANCE">

  <fo:block

   font-size="36pt" line-height="48pt"

   font-family="sans-serif">

   Distance (million miles):

   <xsclass="underline" apply-templates/>

  </fo:block>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Преобразование документа в представление с форматирующими объектами

Для того чтобы преобразовать planets.xml в документ, использующий форматирующие объекты, который я назвал planets.fo, достаточно всего лишь применить таблицу стилей planetsPDF.xsl. Это можно сделать при помощи техник XSLT, уже рассмотренных в этой главе.

Например, чтобы создать planets.fo при помощи Xalan, в Windows сначала нужно установить classpath:

C:\>set classpath=c:\xalan\xalan-1_2_0_0\bin\xalan.jar; c:\xalan\xalan-j_2_0_0\bin\xerces.jar

Затем применить planetsPDF.xsl к planets.xml для генерации planets.fo:

C:\planets>java org.apache.xalan.xslt.Process -IN planets.xml -XSL planetsPDF.xsl -OUT planets.fo

Для задания форматирования документ planets.fo использует форматирующие объекты XSL. Вот как выглядит файл planets.fo (листинг 1.9):

Листинг 1.9. planets.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>

 </fо:layout-master-set>

 <fo:page-sequence master-name="page">

  <fo:flow flow-name="xsl-region-body">

   <fo:block

    font-family="sans-serif" line-height="48pt"

    font-size="36pt" font-weight="bold">

    Name: Mercury

   </fo:block>

   <fo:block

    font-family="sans-serif" line-height="48pt"

    font-size="36pt">

    Mass (Earth = 1): .0553

   </fo-block>

   <fo:block

    font-family="sans-serif" line-height="48pt"