Преобразование в XSL-FO при помощи таблицы стилей XSLT
Преобразование в XSL-FO при помощи таблицы стилей XSLT
В этой главе я создам таблицу стилей для преобразования planets.xml в planets.fo. Я буду создавать таблицу шаг за шагом; для справки я приведу ее окончательный вид (листинг 11.2).
Листинг 11.2. planets.xsl
<?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="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-weight="bold" font-size="36pt"
line-height="48pt" font-family="Times" color="blue">
The Planets Table
</fo:block>
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="PLANET/NAME">
<fo:block font-weight="bold" font-size="28pt"
line-height="48pt" font-family="Times"
font-style="italic">
Planet:
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="PLANET/MASS">
<fo:block font-size="24pt" line-height="32pt"
font-family="Times">
<fo:inline text-decoration="underline">
Mass
</fo:inline>:
<xsl:apply-templates/>
[Earth = 1]
</fo:block>
</xsl:template>
<xsl:template match="PLANET/DAY">
<fo:block font-size="24pt" line-height="32pt"
font-family="Times">
<fo:inline text-decoration="underline">
Day
</fo:inline>:
<xsl:apply-templates/>
[Earth = 1]
</fo:block>
</xsl:template>
<xsl:template match="PLANET/RADIUS">
<fo:block font-size="24pt" line-height="32pt"
font-family="Times">
<fo:inline text-decoration="underline">
Radius
</fo:inline>:
<xsl:apply-templates/>
miles
</fo:block>
</xsl:template>
<xsl:template match="PLANET/DENSITY">
<fo:block font-size="24pt" line-height="32pt"
font-family="Times">
<fo:inline text-decoration="underline">
Density
</fo:inline>:
<xsl:apply-templates/>
[Earth = 1]
</fo:block>
</xsl:template>
<xsl:template match="PLANET/DISTANCE">
<fo:block font-size="24pt" line-height="32pt"
font-family="Times">
<fo:inline text-decoration="underline">
Distance
</fo:inline>:
<xsl:apply-templates/>
million miles
</fo:block>
</xsl:template>
</xsl:stylesheet>
После применения этой таблицы стилей для преобразования planets.xsl будет получен файл planets.fo, который при помощи форматирующих объектов XSL-FO создает документ с видом, показанным на рис. 11.1. Вот как выглядит planets.fo (листинг 11.3).
Листинг 11.3. 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>
</fo:layout-master-set>
<fo:page-sequence master-name="page">
<fo:flow flow-name="xsl-region-body">
<fo:block color="blue" font-family="Times"
line-height="48pt" font-size="36pt" font-weight="bold">
The Planets Table
</fo:block>
<fo:block font-style="italic" font-family="Times"
line-height="48pt" font-size="28pt" font-weight="bold">
Planet:
Mercury
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Mass
</fo:inline>:
.0553
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fо:inline text-decoration="underline">
Day
</fo:inline>:
58.65
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Radius
</fo:inline>:
1516
miles
</fo:block>
<fo:block font-family="Times" line height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Density
</fo:inline>:
.983
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Distance
</fo:inline>:
43.4
million miles
</fo:block>
<fo:block font-style="italic" font-family="Times" line-height="48pt"
font-size="28pt" font-weight="bold">
Planet:
Venus
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Mass
</fo:inline>:
.815
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Day
</fo:inline>:
116.75
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Radius
</fo:inline>:
3716
miles
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Density
</fo:inline>:
.943
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Distance
</fo:inline>:
66.8
million miles
</fo:block>
<fo:block font-style="italic" font-family="Times" line-height="48pt"
font-size="28pt" font-weight="bold">
Planet:
Earth
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Mass
</fo:inline>:
1
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Day
</fo:inline>:
1
[Earth = 1]
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Radius
</fo:inline>:
2107
miles
</fo:block>
<fo:block font-family="Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Density
</fo:inline>:
1
[Earth = 1]
</fo:block>
<fo:block font-family=Times" line-height="32pt" font-size="24pt">
<fo:inline text-decoration="underline">
Distance
</fo:inline>:
128.4
million miles
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Для того чтобы обработать planets.fo и создать форматированный документ, я воспользуюсь процессором fop от Apache XML Project. Как утверждает Apache: «FOP — первое в мире средство форматирования, управляемое форматирующими объектами XSL. Приложение Java считывает дерево форматирующих объектов и затем преобразует его в документ PDF. Дерево форматирующих объектов может быть представлено в форме документа XML (полученного на выходе такого процессора XSLT, как XT или Xalan) или может быть передано в память как документ DOM или (в случае XT) событий SAX».
Я пользуюсь fop 0.17, — последней версией процессора на момент написания книги (похоже, что новые версии выходят практически ежемесячно). Процессор fop можно бесплатно загрузить с http://xml.apache.org/fop. Пакет загрузки fop включает три необходимых для работы файла JAR: fop.jar, w3c.jar и xerces.jar, которые нужно включить в classpath (добавьте правильные пути к этим файлам JAR в соответствии с требованиями вашей системы):
С:>set classpath=.;fop.jar;xerces.jar;w3c.jar
Для преобразования planets.fo в planets.pdf служит класс fop org.apache.fop.apps.CommandLine, которому в командной строке нужно передать имя входного документа, planets.fo, и имя выходного, planets.pdf:
C:>java org.apache.fop.apps.CommandLine planets.fo planets.pdf
Вот и все; окончательный результат, planets.pdf, в средстве просмотра Adobe Acrobat Reader вы увидите, если вернетесь к рис. 11.1.
Теперь вы видели, как выполняется процедура в общем; давайте перейдем к деталям и посмотрим, как создаются документы XSL-FO. Чтобы подробно все рассмотреть, я собираюсь взять за основу листинг 11.2, таблицу стилей XSLT, создающую planets.fo.
СОЗДАНИЕ ДОКУМЕНТОВ XSL-FO С НУЛЯ
Заметьте, что не обязательно создавать таблицу стилей для преобразования документов XSL в форму XSL-FO. Я мог бы написать planets.fo так, как показано в листинге 11.3, с нуля, не прибегая к таблицам стилей XSLT. Но такой способ, как правило, годится только для коротких документов XML. Документы с форматированием XSL-FO становятся весьма длинными очень быстро (сравните длину planets.xml с planets.fo), поэтому для создания документов XSL-FO практически всегда применяйте таблицы стилей XSLT (хотя некоторые примеры в следующей главе достаточно коротки для того, чтобы написать их непосредственно при помощи XSL-FO).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Глава 7 Введение в таблицы стилей и язык CSS
Глава 7 Введение в таблицы стилей и язык CSS 7.1. Встраивание CSS в HTML7.2. Синтаксис CSS7.3. Селекторы7.4. Псевдоэлементы и псевдоклассы7.5. Правило @media7.6. Правила!important7.7. Правило @imporВ этой главе вы изучите основы языка CSS. Вы увидите, насколько легко разрабатываются таблицы стилей. Для
Преобразование документов XML при помощи браузеров
Преобразование документов XML при помощи браузеров Поддержка XSLT включена и в Microsoft Internet Explorer, и в Netscape Navigator. Из этих двух браузеров Internet Explorer обладает гораздо большей поддержкой XSLT, и здесь я буду использовать версию 5.5 этого браузера. О поддержке XSLT в Internet Explorer вы можете
Таблица стилей XSLT
Таблица стилей XSLT В листинге 1.8 приведена таблица стилей planetsPDF.xcl, которая берет данные из planets.xml и форматирует их в файл PDF, planets.pdf. В этом случае для текста я использую крупный шрифт — 36 пунктов.Листинг 1.8. Преобразование XML-XSL-FO<?xml
Упрощенные таблицы стилей
Упрощенные таблицы стилей Как можно заметить на основе рассмотренного до сих пор материала, создавать таблицы стилей XSLT не так-то просто. W3C попытался облегчить эту процедуру, разработав упрощенные таблицы стилей (simplified stylesheets), в которые не нужно — а на самом деле и
Встроенные таблицы стилей
Встроенные таблицы стилей Рекомендация XSLT также поддерживает встроенные таблицы стилей, embedded stylesheets (вслед за использованием встроенных таблиц стилей и элементов стиля в HTML), но, как и упрощенные таблицы стилей, они не очень распространены.Встроенные таблицы стилей
Преобразование документов XML при помощи Internet Explorer
Преобразование документов XML при помощи Internet Explorer В нашем обзоре таблиц стилей есть еще одна тема для обсуждения: как использовать таблицы стилей в Internet Explorer. Как мы видели в главе 1, для считывания документов XML и XSL можно использовать JavaScript, и осуществлять преобразование
Таблицы стилей
Таблицы стилей Мы рассмотрели пять разновидностей стилей CSS. Четыре из них — стилевые классы, стили переопределения тега, именованные и комбинированные стили — могут присутствовать только в таблицах стилей. Это мы уже знаем.Таблицы стилей, в зависимости от места их
Таблицы стилей
Таблицы стилей Мы рассмотрели пять разновидностей стилей CSS. Четыре из них — стилевые классы, стили переопределения тега, именованные и комбинированные стили — могут присутствовать только в таблицах стилей. Это мы уже знаем.Таблицы стилей, в зависимости от места их
Каскадные (иерархические) таблицы стилей
Каскадные (иерархические) таблицы стилей http://www.w3.org/Style/Web Style Sheets – стандарты.http://www.webreview.com/guides/style/ – Web Review Style Sheets Reference Guide – справочное
Каскадные таблицы стилей — CSS
Каскадные таблицы стилей — CSS Вообще, все уважающие себя веб-мастера используют в своей работе так называемые каскадные таблицы стилей (CSS). Что это такое? Сайт, как правило, состоит из нескольких страничек. Их может быть и десять, и сто, и даже несколько тысяч. Естественно,
14.7. Преобразование документа XML с помощью XSLT
14.7. Преобразование документа XML с помощью XSLT ПроблемаТребуется преобразовать документ XML, используя таблицу стилей XSLT.РешениеИспользуйте библиотеку Xalan. Во-первых, сконструируйте экземпляр конвертора XSTL xalanc::XalanTransformer. Затем сконструируйте два экземпляра xalanc::XSLTInputSource
Отличия XSLT 1.1 от XSLT 1.0
Отличия XSLT 1.1 от XSLT 1.0 Отсутствие result tree fragment Главное и наиболее существенное отличие XSLT 1.1 от XSLT 1.0 состоит в том, что тип данных, известный в XSLT 1.0 как result tree fragment (результирующий фрагмент дерева) в XSLT 1.1. отсутствует. Вместо него в версии 1.1 используется множество узлов,
Отличия XSLT 2.0 от XSLT 1.1
Отличия XSLT 2.0 от XSLT 1.1 Прежде чем приступить к описанию отличий второй версии XSLT от версии 1.1 (и, соответственно, 1.0), следует сделать одно существенное замечание. Лицензионные соглашения Консорциума W3 не позволяют раскрывать широкой общественности внутренние материалы