Открыть сервис

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-документов:

  1. Исходный XML-документ содержит данные в структурированном виде.
  2. XSLT-преобразование применяет к исходному документу XSLT-стиль, который генерирует на выходе XSL-FO-документ.
  3. 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 →