Хранение данных в рамках такой архитектуры, как XForms/REST/XQuery [XRX], сегодня является обычным явлением (см. раздел Ресурсы). Хранящиеся таким образом данные можно запрашивать, извлекать и преобразовывать в желаемый формат. Кроме того, разработчики веб-приложений могут предоставлять пользователям возможности для извлечения данных в формате HTML (для просмотра в своих веб-браузерах) или в виде PDF-файлов (с целью загрузки для последующего использования).
В этой статье показано, каким образом можно преобразовать XML-данные в HTML, затем из HTML в XSL-FO, и, наконец, из XSL-FO в PDF с помощью функции расширения XQuery, основанной на инструменте CSSToXSLFO (см. раздел Ресурсы).
Преобразование XML-данных в другие форматы
Как правило, для преобразования данных из XML в HTML и в XSL-FO требуются две XSL-таблицы стилей: одна таблица для преобразования из XML в HTML и другая таблица стилей XSL-FO для преобразования HTML в XSL-FO-документ, который затем преобразуется в PDF с помощью процессора XSL-FO. Другими словами, для такой среды, как веб-приложение, генерирующее отчеты в форматах HTML и PDF, разработчику необходимо написать новую таблицу стилей XSLT, которая преобразует данные в HTML, а затем написать, отладить и сопровождать соответствующую таблицу стилей XSL-FO. Поддержание этих таблиц стилей может оказаться трудным делом, а работа с технологией XSL-FO также далеко не проста. К счастью, отчеты не обязаны быть изощренными, поэтому их разметку можно с легкостью выразить с помощью CSS-файла. Затем такой CSS-файл можно обработать с помощью утилиты
CSSToXSLFO, которая способна генерировать нужный XSL-FO-документ после написания лишь небольшого объема программного кода.
Этот процесс и другие подобные ситуации идеально подходят для применения описываемого в данной статье подхода — написания XSLT-таблицы стилей, которая преобразует XML в HTML, с последующим включением в нее нескольких дополнительных CSS-инструкций, позволяющих этой таблице осуществлять преобразование HTML в XSL-FO, а затем в PDF.
Утилита
CSSToXSLFO
поддерживает преобразования XML-документа вместе с CSS-таблицей стилей версии 2 (CSS2) в XSL-FO-документ. Чтобы использовать эту утилиту, я разработал функцию расширения XQuery для XML-СУБД eXist в виде фрагмента модуля расширения XQuery для цифровой публикации.
Эта утилита обрабатывает большую часть спецификаций CSS2. Для поддержки специфических особенностей XSL-FO эта утилита предоставляет несколько CSS-инструкций расширения, которые обычно игнорируются браузерами. Используйте эти свойства в правиле @page раздела @media в таблице стилей CSS. Эти свойства связаны с такими артефактами страницы, как регионы, нумерация, ссылки, заголовки, именованные строки, переносы, сноски, внешние графические элементы и нетипичные элементы. Обязательно просмотрите руководство по утилите CSSToXSLFO (см. раздел Ресурсы) для получения дополнительной информации об этом инструменте и изучения рекомендаций по совершенствованию создаваемой вами таблицы стилей XSLT.
eXist-db — это система управления базами данных (СУБД) с открытым исходным кодом, построенная полностью на XML-технологиях (XML-СУБД). Она поддерживает, помимо других стандартов, XQuery, XPath и XSLT. СУБД eXist хранит данные согласно XML-модели данных и обладает высокой степенью совместимости со стандартом XQuery. Хранящиеся данные обрабатываются с помощью XQuery с использованием индекса. Кроме того, эта СУБД поддерживает полнотекстовый индекс на основе Apache Lucene.
XQuery-механизм, применяющийся в СУБД eXist, является расширяемым; соответственно в состав eXist входят различные модули расширения XQuery. Эти модули поддерживают следующие функции расширения XQuery.
- Глобальный кэш пар "ключ-значение"
- Разнообразные операции сжатия
- Дополнительные операции с типами "дата/время"
- Разнообразные операции с файлами и каталогами
- HTTP-запросы (XPath-модуль)
- Операции, применяемые к изображениям, хранящимся в базе данных (получение размеров изображения, создание миниатюр, изменение размеров изображения)
- Применение интерфейса Java Naming and Directory Interface для доступа к таким каталогам, как LDAP, и для манипулирования этими каталогами
- Отправка электронных писем в текстовом формате или в формате HTML
- Календарное планирование выполнения заданий и управление существующими заданиями
- Выполнение SQL-операций с реляционной СУБД
- Выявление различий между XML-узлами
- Представление XSL-FO
- Функциональность XProc
- Криптографические операции
И модуль eXist, и утилита CSSToXSLFO написаны на языке Java. На момент написания данной статьи модуль eXist позволяет использовать в качестве XSL-FO-процессора процессор Apache Formatting Objects Processor (FOP) или процессор RenderHouse XEP. Посетите веб-сайт eXist для ознакомления с инструкциями по установке этой СУБД, которые помогут вам выполнить примеры из этой статьи.
eXist-модуль для цифровой публикации
В настоящее время eXist-модуль модуль для цифровой публикации находится в стадии разработки и со временем будет поддерживать большее количество функций. На данный момент этот модуль имеет функцию
html-to-xslfo(), которая весьма полезна в случае применения подхода, описываемого в этой статье.
Цель этого модуля состоит в том, чтобы служить единым источником для всех функций расширения XQuery, необходимых для цифровой публикации, в том числе для преобразования между следующими форматами: DocBook, Open XML, DOC, DOCX, .html, PDF, TXT, RTF, PPT, PPTX, CSV. Для установки этого модуля в среде eXist выполните следующие шаги:
- Загрузите eXist-модуль для цифровой публикации в формате JAR, а затем скопируйте его в каталог $EXIST_HOME/lib/extensions.
- Загрузите CSS-файл2xslfo1_6_2.jar, а затем скопируйте его в каталог $EXIST_HOME/lib/user.
-
Добавьте
<module class="ro.kuberam.kPub.kPubModule" uri="http://kuberam.ro/k-Pub"/>в раздел встроенных модулей в файле $EXIST_HOME/conf.xml.
В этом разделе анализируется использование утилиты CSSToXSLFO
реализованной в eXist-модуле расширения XQuery для цифровой публикации. При решении этой задачи используйте XML-данные, представленные в листинге 1, а также таблицу стилей XSLT (xml-to-html.xsl), включенную в пример кода (см. раздел Загрузка.
Примечание: Чтобы упростить восприятие этой статьи, я не привожу в ней все содержимое используемой таблицы стилей XSLT. Вместо этого я показываю лишь те элементы, которые делают эту таблицу стилей пригодной для преобразования XML в HTML и в PDF.
Примеры будут загружены в XML-СУБД eXist в виде коллекции с именем html-and-pdf-single-stylesheet расположенной в корневой коллекции eXist — это позволит вам просмотреть каждый пример в своем браузере. Например, чтобы просмотреть пример 1, введите в адресной строке своего браузера следующий URL-адрес (предполагается, что СУБД eXist установлена на локальной машине).
http://127.0.0.1:8080/rest/db/html-and-pdf-single-stylesheet/example%201/example1.xql |
Чтобы значительно полнее использовать функциональные возможности инструмента CSSToXSLFO
вам не потребуется никакой другой XQuery-код, кроме кода, показанного в листинге 2
и
листинге 3. Этот код представляет XML-данные в формате HTML и в формате PDF соответственно. Для дальнейшего совершенствования PDF-документов необходимо добавить CSS-инструкции в CSS-раздел таблицы стилей XSLT.
Листинг 1. XML-документ, представляющий собой сводку выставленных счетов-фактур (файл xml-data.xml в примерах кода)
<invoices-summary>
<invoice id="">
<issue-date>2011-10-17</issue-date>
<amount>108</amount>
<vat>19.47</vat>
<vat-base>22</vat-base>
<currency>EURO</currency>
<customer-id>0001008</customer-id>
</invoice>
<invoice id="">
<issue-date>2011-10-17</issue-date>
<amount>40</amount>
<vat>7.21</vat>
<vat-base>22</vat-base>
<currency>EURO</currency>
<customer-id>0000017</customer-id>
</invoice>
<invoice id="">
<issue-date>2011-10-17</issue-date>
<amount>1700</amount>
<vat>306.56</vat>
<vat-base>22</vat-base>
<currency>EURO</currency>
<customer-id>0000040</customer-id>
</invoice>
</invoices-summary>
|
Первый пример (см. листинг 2), представляет собой XQuery-скрипт, который преобразует XML-данные, представленные в листинге 1 в формат HTML. Этот скрипт использует eXist-функцию transform:transform(), которая, в свою очередь, преобразует XML-данные с помощью таблицы стилей XSLT и (при желании) параметров для преобразования. Вы можете написать таблицу стилей XSLT в соответствии со спецификацией XSLT 1.0 (средствами Apache Xalan) или в соответствии со спецификацией XSLT 2.0 (например, средствами Saxon).
Листинг 2. XQuery-скрипт, преобразующий XML-данные в формат HTML (файл example-01.xql в примерах кода)
xquery version "1.0";
let $xml-data := doc('/db/html-and-pdf-single-stylesheet/xml-data.xml')
let $xslt-stylesheet := doc( '/db/html-and-pdf-single-stylesheet/xml-to-html.xsl' )
let $html := transform:transform($xml-data, $xslt-stylesheet, ())
return $html
|
На рисунке 1 показан результирующий HTML-документ, отображенный в моем браузере. Этот HTML-документ демонстрирует сведения по трем счетам-фактурам с использованием шрифта без засечек. (Перейдите по ссылке: Текстовая версия форматированного контента, представленного на рис. 1 и на рис. 2).
Рисунок 1. Результат преобразования в формат HTML
Сначала XML-данные преобразуются в формат HTML, как в предыдущем примере. Результирующий HTML-документ содержит все CSS-инструкции, необходимые для представления HTML-документа в желаемом виде, а также специфические CSS-инструкции расширения для CSSToXSLFO, которые позволяют задействовать более изощренные функции XSL-FO.
Для простого сценария применения который описывается этой статье, такие инструкции расширения нам не нужны. Утилита CSSToXSLFO преобразует HTML-документ в XSL-FO-документ, который, в свою очередь, генерирует PDF-документ, весьма похожий на HTML-документ.
После этого мы преобразуем результирующий HTML-документ в XSL-FO-документ с помощью функции html-to-xslfo(), а затем генерируем PDF-документ (см. листинг 3). Для создания PDF-документа используется функция
render()
eXist-модуля xslfo.
Листинг 3. XQuery-скрипт, преобразующий XML-данные в формат PDF (файл example-02.xql в примерах кода)
xquery version "1.0";
declare namespace xslfo="http://exist-db.org/xquery/xslfo";
declare namespace k-Pub="http://kuberam.ro/k-Pub";
let $xml-data := doc('/db/html-and-pdf-single-stylesheet/xml-data.xml')
let $xslt-stylesheet := doc('/db/html-and-pdf-single-stylesheet/xml-to-html.xsl')
let $html := transform:transform($xml-data, $xslt-stylesheet, ())
let $fo := k-Pub:html-to-xslfo($html)
let $pdf := xslfo:render($fo, "application/pdf", ())
return response:stream-binary( $pdf, "application/pdf", "output.pdf" )
|
На рисунке 2 показан результирующий PDF-документ, отображенный в моем браузере. Этот PDF-документ демонстрирует сведения по трем счетам-фактурам с использованием шрифта с засечками. (Перейдите по ссылке: Текстовая версия форматированного контента, представленного на рис. 1 и на рис. 2.)
Рисунок 2. Результат преобразования в формат PDF
В листинге 4 показаны CSS-инструкции, необходимые для представления XML-данных в формате HTML и в формате PDF. Для получения аналогичного PDF-файла я добавил лишь одну CSS-инструкцию — которая представляет заголовки таблицы с помощью полужирного шрифта.
Листинг 4. CSS-инструкции для аналогичного представления XML-данных в формате HTML и в формате PDF
body {
font-family: arial;
font-size: 12px;
text-align: center;
}
table {
border-collapse: collapse;
width: 100%;
border: solid black 1px;
}
table th, td {
border: solid black 1px;
}
@media screen {
body {
width: 570px;
}
}
@media print {
table th {
font-weight: bold;
}
}
|
В этой статье для преобразования XML-данных в форматы HTML и PDF я применил простую функцию, которая использует лишь мощь и простоту CSS-синтаксиса, а также несколько инструкций расширения, позволяющих задействовать более сложные функции XSL-FO. Этот подход особенно полезен в ситуациях, когда обрабатываемые отчеты или документы имеют простое стилевое решение.
| Описание | Имя | Размер | Метод загрузки |
|---|---|---|---|
| Полные примеры программного кода | html-and-pdf-single-stylesheet.zip | 4 КБ | HTTP |
Научиться
- Веб-разработка на основе XRX: Ознакомьтесь с дополнительной информацией о среде XRX.
- Руководство пользователя утилиты CSSToXSLFO: ознакомьтесь с новыми идеями по таблицам стилей и форматированию.
Получить продукты и технологии
- Веб-сайт СУБД eXist с нативной поддержкой XML: загрузите СУБД eXist и получите инструкции по ее установке.
- The
eXist-модуль для цифровой публикации: загрузка с ресурса Google Code. - The
Утилита CSSToXSLFOutility: загрузка с ресурса SourceForge.
