XSL-FO
XSL-FO (XSL Formatting Objects) — это язык разметки для описания форматирования и визуального представления XML-документов, предназначенный для преобразования их в печатные или фиксированные форматы, такие как PDF, PostScript или RTF. XSL-FO является частью спецификации XSL (Extensible Stylesheet Language), разработанной консорциумом W3C (World Wide Web Consortium), и используется совместно с XSLT (XSL Transformations) для преобразования исходного XML-документа в форматированный вывод. В отличие от CSS (Cascading Style Sheets), ориентированного на экранное отображение веб-страниц, XSL-FO специализируется на точном контроле над типографикой, разбивкой на страницы, колонтитулами и другими элементами, важными для полиграфии и документооборота.
История
Разработка XSL началась в 1998 году как попытка создать единый язык для преобразования и форматирования XML-документов. Первоначально проект предполагал создание одного языка, но в процессе работы он был разделён на две части: XSLT (для преобразования) и XSL-FO (для форматирования). Первая рабочая версия XSL-FO (Candidate Recommendation) была опубликована W3C в ноябре 2000 года. Окончательная версия 1.0 стала рекомендацией W3C 15 октября 2001 года. В 2006 году вышла версия 1.1, которая добавила поддержку многоколоночной вёрстки, индексных меток и улучшенную работу с таблицами. Несмотря на то, что XSL-FO не получил широкого распространения в веб-среде, он остаётся стандартом для автоматизированной генерации сложных печатных документов, особенно в корпоративных и издательских системах.
Архитектура и принцип работы
XSL-FO работает в рамках трёхзвенной архитектуры обработки XML-документов:
- Исходный XML-документ содержит данные в структурированном виде.
- XSLT-преобразование применяет к исходному документу XSLT-стиль, который генерирует на выходе XSL-FO-документ.
- FO-процессор (форматирующий процессор) интерпретирует XSL-FO-документ и создаёт конечный документ в заданном формате (PDF, PostScript, AFP и др.).
Таким образом, XSL-FO не предназначен для ручного написания. Обычно он генерируется автоматически в результате XSLT-преобразования, что позволяет отделить логику форматирования от данных.
Основные элементы и структура
XSL-FO-документ имеет строгую иерархическую структуру, основанную на XML-синтаксисе. Корневым элементом является <fo:root>. Основные элементы включают:
Макет страницы (<fo:layout-master-set>)
Определяет шаблоны страниц (page masters), которые задают размеры, поля, колонтитулы и области для разных типов страниц (например, первая страница, чётная/нечётная, пустая). Основные элементы:
<fo:simple-page-master>— задаёт геометрию одной страницы.<fo:page-sequence-master>— управляет последовательностью использования разных шаблонов страниц.
Последовательность страниц (<fo:page-sequence>)
Группирует содержимое, которое будет выводиться на страницы одного типа (например, глава книги). Каждая последовательность может иметь свой набор колонтитулов и нумерацию страниц.
Поток (<fo:flow>)
Содержит основное содержимое документа, которое автоматически заполняет страницы. Поток располагается в области body страницы.
Блоки (<fo:block>)
Основной элемент для группировки текста и других объектов. Блоки аналогичны абзацам в текстовых процессорах. Они могут содержать текст, встроенные элементы (inline) и другие блоки.
Встроенные элементы (<fo:inline>)
Используются для форматирования части текста внутри блока (например, выделение жирным шрифтом, изменение цвета).
Таблицы (<fo:table>)
XSL-FO поддерживает сложные таблицы с объединением ячеек, управлением шириной столбцов и стилями границ. Основные элементы: <fo:table-body>, <fo:table-row>, <fo:table-cell>.
Списки (<fo:list-block>)
Позволяют создавать нумерованные и маркированные списки. Элементы списка задаются с помощью <fo:list-item>.
Графика и изображения
Изображения вставляются через элемент <fo:external-graphic>, который ссылается на внешний файл (например, JPEG, PNG). Поддерживается встраивание SVG-графики.
Форматирование и типографика
XSL-FO предоставляет детальный контроль над типографическими параметрами:
- Шрифты: выбор гарнитуры (
font-family), размера (font-size), начертания (font-weight,font-style). - Интервалы: межстрочный интервал (
line-height), межбуквенный интервал (letter-spacing), отступы (margin,padding). - Выравнивание: по левому краю, правому, центру, по ширине (
text-align). - Переносы: автоматическая расстановка переносов (
hyphenate). - Разбивка на страницы: управление разрывами страниц (
page-break-before,page-break-after,keep-with-next).
Применение
XSL-FO используется в сценариях, где требуется автоматическое создание документов с фиксированным макетом и высокими требованиями к типографике:
- Издательское дело: генерация книг, журналов, брошюр из XML-данных (например, DocBook, DITA).
- Корпоративная отчётность: создание сложных отчётов, счетов, контрактов в формате PDF.
- Документооборот: автоматическая подготовка юридических и финансовых документов.
- Техническая документация: преобразование структурированной документации (например, в формате DITA) в печатные руководства.
Программное обеспечение
Для обработки XSL-FO используются специализированные FO-процессоры. Среди наиболее известных:
- Apache FOP (Formatting Objects Processor) — свободный процессор на Java, поддерживает большую часть спецификации XSL-FO 1.0 и частично 1.1. Является наиболее распространённым решением с открытым исходным кодом.
- Antenna House Formatter — коммерческий процессор, известный высокой степенью соответствия спецификации и качеством вывода.
- RenderX XEP — коммерческий процессор, поддерживающий XSL-FO 1.1 и используемый в крупных корпоративных системах.
- IBEX PDF Creator — коммерческий процессор для .NET-среды.
Критика и ограничения
Несмотря на свою мощность, XSL-FO имеет ряд недостатков:
- Сложность: язык громоздок и труден для ручного написания. Даже простое форматирование требует большого объёма XML-кода.
- Отсутствие поддержки в вебе: XSL-FO не поддерживается браузерами и не предназначен для экранного отображения.
- Зависимость от XSLT: для практического использования требуется написание двух стилей (XSLT и XSL-FO), что увеличивает сложность разработки.
- Ограниченная поддержка CSS-подобных свойств: некоторые современные возможности вёрстки (например, гибкие макеты) отсутствуют или реализованы сложнее, чем в CSS.
- Производительность: обработка больших документов может быть ресурсоёмкой, особенно при использовании бесплатных процессоров.
Альтернативы
В современных системах XSL-FO часто уступает место более простым или специализированным решениям:
- CSS Paged Media (CSS Paged Media Module) — расширение CSS для печатных макетов, поддерживаемое некоторыми браузерами и утилитами (например, Prince XML, WeasyPrint). Позволяет описывать печатные макеты с помощью знакомого синтаксиса CSS.
- LaTeX — система вёрстки, широко используемая в академической среде для создания сложных документов с математическими формулами.
- PDF-библиотеки (например, iText, PDFBox) — позволяют программно генерировать PDF-файлы без использования промежуточных форматов.
Источники
- W3C. «Extensible Stylesheet Language (XSL) Version 1.1». W3C Recommendation, 5 December 2006.
- W3C. «XSL Transformations (XSLT) Version 1.0». W3C Recommendation, 16 November 1999.
- Dave Pawson. «XSL-FO». O'Reilly Media, 2002.
- Apache Software Foundation. «Apache FOP: XSL-FO to PDF, PostScript, etc.».
- Antenna House, Inc. «Antenna House Formatter Documentation».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →