Индивидуальное задание

Тема: Использование языка XSLT для преобразования XML документа в форматы представления электронных документов в Интернет: HTML, PDF.

Задание: Взять в качестве исходного документа XML документ, созданый в лабораторной работе №1. Используя Пример, представленый ниже, лекции и умения, полученный в результате выполнения лабораторной работы №6, написать командный файл для получения из XML документа, согласно XSL правил (необходимо также Вам создать), документов HTML и PDF, хранящих указаную в первоначальном документе информацию.

Замечание. Для работы потребуются инструментальные средства: любой текстовый редактор , парсер XSLT шаблонов xsltproc, транслятор XSL-FO в PDF Apache FOP. Информацию про XSL-FO можно прочитать здесь.

Практический пример.

Пусть имеется созданый XML документ.

<?xml version="1.0"?>
<sonnet type="Shakespearean">
  <author>
    <lastName>Shakespeare</lastName>
    <firstName>William</firstName>
    <nationality>British</nationality>
    <yearOfBirth>1564</yearOfBirth>
    <yearOfDeath>1616</yearOfDeath>
  </author>
  <title>Sonnet 130</title>
  <lines>
    <line>My mistress' eyes are nothing like the sun,</line>
    <line>Coral is far more red than her lips red.</line>
    <line>If snow be white, why then her breasts are dun,</line>
    <line>If hairs be wires, black wires grow on her head.</line>
    <line>I have seen roses damasked, red and white,</line>
    <line>But no such roses see I in her cheeks.</line>
    <line>And in some perfumes is there more delight</line>
    <line>Than in the breath that from my mistress reeks.</line>
    <line>I love to hear her speak, yet well I know</line>
    <line>That music hath a far more pleasing sound.</line>
    <line>I grant I never saw a goddess go,</line>
    <line>My mistress when she walks, treads on the ground.</line>
    <line>And yet, by Heaven, I think my love as rare</line>
    <line>As any she belied with false compare.</line>
  </lines>
</sonnet>

Для преобразования в HTML мы создали шаблон

<?xml version="1.0" ?>
<xsl:stylesheet
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">

<xsl:template match="/sonnet">
  <html><head>
  <title>Shakespearean sonnet
  </title></head>
  <body>
  <xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="author">
  <h1><xsl:value-of select="lastName"/>,
  <xsl:value-of select="firstName"/>
    (<xsl:value-of select="yearOfBirth"/>-
     <xsl:value-of select="yearOfDeath"/>),
  <xsl:value-of select="nationality"/>
  </h1><br/><hr/>
</xsl:template>

<xsl:template match="lines">
  <xsl:for-each select="line">
    <xsl:value-of select="."/><br/>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Для преобразования в XSL-FO мы создали шаблон

<?xml version="1.0" ?>
<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:fo="http://www.w3.org/1999/XSL/Format"
   version="1.0">

<xsl:template match="/sonnet">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simpleA4"
      page-height="29.7cm" page-width="21cm"
      margin-top="2cm" margin-bottom="2cm"
      margin-left="2cm" margin-right="2cm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="simpleA4">
    <fo:flow flow-name="xsl-region-body">
     <xsl:apply-templates/>
    </fo:flow>
  </fo:page-sequence>
</fo:root></xsl:template>

<xsl:template match="author">
 <fo:block>
 <xsl:value-of select="lastName"/>,
 <xsl:value-of select="firstName"/>
 (<xsl:value-of select="yearOfBirth"/>-
  <xsl:value-of select="yearOfDeath"/>),
 <xsl:value-of select="nationality"/>
</fo:block>
</xsl:template>

<xsl:template match="lines">
  <xsl:for-each select="line">
    <fo:block><xsl:value-of select="."/></fo:block>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Пусть исходный XML документ, а также XSL шаблоны находятся в одной текущей директории. Соответсвенно в поддиректории classes находятся классы xalan и fop соответственно в директориях с такими же названиями.

Тогда команды для преобразования могут выглядеть следующим образом:

xsltproc sonnetrules.xsl sonnet.xml -o sonnet_tesult_html.html
xsltproc sonnet2fo.xsl sonnet.xml -o sonnet_result.fo

Получить PDF из XSL-FO можно с помощью команды:

call classes\fop\fop.bat sonnet_result.fo sonnet_result.pdf