Введение
XSL FO (XSL Formatting Objects) — это язык разметки для форматирования XML-документов, который наиболее часто используется для генерации PDF-файлов. XSL FO является частью XSL (Extensible Stylesheet Language) — набора технологий W3C, предназначенного для преобразования и форматирования данных XML. Другими компонентами XSL являются XSLT и XPath. Версия 1.1 XSL FO была опубликована в 2006 году. W3C считает XSL FO полностью разработанным: последнее обновление рабочей версии датируется январем 2012 года, а рабочая группа была расформирована в ноябре 2013 года.
Основы
В отличие от комбинации HTML и CSS, XSL FO является унифицированным языком представления. Он не содержит семантической разметки в том смысле, в котором этот термин используется в HTML. И, в отличие от CSS, который изменяет стандартное представление внешнего XML или HTML-документа, он хранит все данные документа внутри себя. Основная идея использования XSL FO заключается в том, что пользователь пишет документ не на FO, а на языке XML. XHTML, DocBook и TEI – все это возможные примеры. Затем пользователь получает преобразование XSLT, либо создавая его самостоятельно, либо находя подходящее для данного типа документа. Это преобразование XSLT преобразует XML в XSL FO. После генерации документа XSL FO он передается в приложение, называемое FO-процессором. FO-процессоры преобразуют документ XSL FO в читаемый, печатаемый или и то, и другое представление. Наиболее распространенным результатом работы XSL FO является PDF-файл или PostScript, но некоторые FO-процессоры могут выводить данные в другие форматы, такие как файлы RTF или даже просто окно в графическом интерфейсе пользователя, отображающее последовательность страниц и их содержимое. Сам язык XSLT изначально разрабатывался исключительно для этой цели, но сейчас широко используется для более общих преобразований XML. Этот шаг преобразования настолько прочно укоренился в практике XSL FO, что нередко XSLT, преобразующий XML в XSL FO, ошибочно называют самим документом XSL FO. Даже учебные пособия по XSL FO часто пишутся с использованием команд XSLT, окружающих инструкции обработки FO. Преобразование XSLT исключительно мощно. Оно позволяет автоматически генерировать оглавление, перекрестные ссылки, указатель и другие возможности. Документ XSL FO отличается от PDF или PostScript. Он не определяет окончательно расположение текста на страницах. Вместо этого он описывает внешний вид страниц и размещение содержимого. Затем FO-процессор определяет, как расположить текст в пределах границ, заданных документом FO. Спецификация XSL FO даже допускает, чтобы разные FO-процессоры по-разному обрабатывали одни и те же документы, что приводит к различным результатам. Например, некоторые FO-процессоры могут делать переносы слов, чтобы минимизировать пробелы при переносе строки, в то время как другие этого не делают. Разные процессоры могут использовать различные алгоритмы переноса слов – от простых до сложных, учитывающих, есть ли переносы на предыдущей или следующей строке. В некоторых случаях это может существенно изменить макет страниц. Существуют и другие случаи, когда спецификация XSL FO явно предоставляет FO-процессорам определенную свободу в выборе макета. Эта разница в работе FO-процессоров, приводящая к несогласованным результатам, часто не вызывает опасений. Это связано с тем, что основное назначение XSL FO – генерация документов для постраничных носителей, предназначенных для печати. Сами документы XSL FO обычно используются как промежуточные, в основном для создания PDF-файлов или печатных документов в качестве конечной формы для распространения. Это отличается от того, как HTML генерируется и распространяется в конечной форме непосредственно пользователю. Распространение готового PDF-файла, а не входных данных языка форматирования (HTML/CSS или XSL FO), с одной стороны, защищает получателей от непредсказуемости, вызванной различиями между интерпретаторами языка форматирования, а с другой – лишает документ возможности легко адаптироваться к потребностям получателей, таким как другой размер страницы, предпочтительный размер шрифта или настройка для отображения на экране, на бумаге или в аудиоформате.
Языковые понятия
Язык XSL FO был разработан для страничных носителей; следовательно, концепция страниц является неотъемлемой частью структуры XSL FO. FO лучше всего подходит для так называемого "контент-ориентированного" дизайна. Это стандартный метод верстки книг, статей, юридических документов и тому подобного. Он предполагает единый непрерывный поток текста с относительно связным содержанием, с различной повторяющейся информацией, встроенной в поля страницы. Это отличается от "макет-ориентированного" дизайна, который используется в газетах или журналах. Если контент в этих документах не помещается в отведенное пространство, часть его обрезается, пока он не поместится. XSL FO нелегко справляется с жесткими ограничениями журнальной верстки; более того, во многих случаях ему не хватает возможности выразить некоторые формы такой верстки. Несмотря на простоту конструкции языка, он обладает значительной выразительностью. Доступны таблицы, списки, боковые элементы, а также множество других функций. Эти функции сопоставимы с функциями верстки CSS, хотя некоторые из них предполагается реализовать с помощью XSLT.
Структура документа
Документы XSL FO являются документами XML, но не обязаны соответствовать какой-либо DTD или схеме. Вместо этого они соответствуют синтаксису, определенному в спецификации XSL FO. Документы XSL FO содержат два обязательных раздела. Первый раздел содержит описание списка именованных макетов страниц. Второй раздел – это список данных документа с разметкой, использующий различные макеты страниц для определения способа заполнения контентом различных страниц. Макеты страниц определяют свойства страницы, включая направление потока текста для соответствия языковым конвенциям, размер страницы и ее поля. Особенно важно, что они могут определять последовательности страниц, позволяющие создавать эффекты, при которых нечетные и четные страницы выглядят по-разному. Например, можно определить последовательность макетов страниц, предоставляющую дополнительное пространство для внутренних полей при печати, что позволяет увеличить пространство для переплета книги. Часть данных документа разбита на последовательность потоков, каждый из которых привязан к макету страницы. Потоки содержат список блоков, каждый из которых, в свою очередь, содержит список текстовых данных, встроенных элементов разметки или их комбинацию. Контент также может быть добавлен на поля документа, например, номера страниц или заголовки глав. Блоки и встроенные элементы функционируют аналогично CSS, хотя некоторые правила для отступов и полей отличаются между FO и CSS. Направление прогрессии блоков и встроенных элементов относительно ориентации страницы может быть полностью задано, что позволяет документам FO работать с языками, которые читаются справа налево или сверху вниз. В отличие от CSS 2.1, спецификация FO использует нейтральные термины, такие как «начало» и «конец», вместо «лево» и «право» при описании направлений. Базовая разметка контента XSL FO основана на CSS и его каскадных правилах. Следовательно, многие атрибуты в XSL FO наследуются дочерними элементами, если они не переопределены явно.
Возможности XSL-FO v1.0
XSL FO предоставляет широкие возможности для оформления текста. Помимо информации, указанной выше, язык XSL FO позволяет задать следующее.
Многоколонки
Страница может быть определена как имеющая несколько столбцов. В этом случае блоки по умолчанию перетекают из одной колонки в другую. Отдельные блоки могут быть настроены на охват всех столбцов, создавая тем самым разрыв в тексте на странице. Колонки выше этого разрыва будут перетекать друг в друга, как и колонки ниже разрыва, но текст не может перетекать из верхней части страницы в нижнюю. В силу особенностей спецификации страниц XSL FO, разные страницы могут иметь разное количество и ширину столбцов. Поэтому текст может легко перетекать со страницы с 3 колонками на страницу с 5 колонками и далее на страницу с 1 колонкой. Все возможности FO работают в рамках ограничений многоколоночной страницы. Мы можем задать охват нескольких столбцов, указав два атрибута, например, `span` и `padding-after`.
Списки
Список XSL FO, по сути, представляет собой два набора блоков, расположенных рядом друг с другом. Элемент списка состоит из блока с «левой» или начальной стороны и последовательности блоков с «правой» или конечной стороны. Блок слева концептуально соответствует номеру или маркеру списка. Однако это может быть и просто строка текста, как, например, в словарной статье. Блок справа функционирует как ожидается. Оба этих блока могут быть контейнерами блоков или содержать несколько блоков в одном элементе списка. Нумерация списков XSL FO, если она предусмотрена, должна выполняться на этапе XSLT или в другом процессе, который сгенерировал документ XSL FO. Следовательно, нумерованные списки должны быть явно пронумерованы в XSL FO.
Контроль за страницеобразованием
Пользователь может указать параметры "вдова и сирота" для блоков или для всего потока, а также разрешить каскадирование этих параметров на дочерние блоки. Кроме того, можно указать, чтобы определенные блоки оставались на одной странице. Например, блок изображения и его описание можно настроить так, чтобы они никогда не разделялись. FO-процессор приложит все усилия для выполнения этих указаний, даже если для этого потребуется оставить много пустого места на странице.
Сноски
Пользователь может создавать сноски, которые отображаются внизу страницы. Текст сноски записывается в документе FO в обычном потоке текста в месте ссылки на неё. Сама ссылка может быть представлена как встроенное определение, хотя это и не обязательно. Содержание сноски состоит из одного или нескольких блоков, которые процессор FO размещает внизу страницы. Процессор FO гарантирует, что сноска, на которую указывает ссылка, всегда будет начинаться на той же странице, что и сама ссылка. Это будет соблюдаться даже если для этого потребуется добавить дополнительное пустое пространство на странице.
Таблицы
Таблица FO функционирует аналогично таблице HTML/CSS. Пользователь задает строки данных для каждой отдельной ячейки. Пользователь также может указать некоторые параметры оформления для каждого столбца, например, цвет фона. Кроме того, пользователь может определить первую строку как строку заголовка таблицы, с собственными отдельными параметрами оформления. Процессору FO можно указать точный размер каждого столбца или разрешить ему автоматически подстраивать ширину столбцов под содержимое.
Контроли ориентации текста
FO имеет широкие возможности для управления ориентацией текстовых блоков. Можно в середине страницы выделить блок текста для отображения в другой ориентации. Такие блоки могут использоваться для языков, требующих ориентации, отличной от остального документа, или просто для изменения ориентации текста в целях оформления. Эти блоки могут содержать практически любой контент, включая таблицы, списки и даже другие блоки текста, ориентированного повторно.
Разное
Цитаты с номерами страниц. Страницу, содержащую специальный тег, можно указать в тексте, а процессор форматирования (FO) подставит фактический номер страницы, где этот тег расположен. Границы блоков различных стилей. Фоновые цвета и изображения. Управление шрифтами и их насыщенностью, как в CSS. Плавающие элементы сбоку. Прочие встроенные элементы.
Возможности XSL-FO v1.1
Версия 1.1 XSL FO добавляет ряд новых возможностей по сравнению с версией 1.0.
Многочисленные потоки и отображение потоков
XSL FO 1.0 был довольно строгим в отношении того, какой текст допускалось размещать в различных областях страницы. Версия 1.1 значительно ослабляет эти ограничения, позволяя непрерывному тексту быть размещенным в нескольких явно определенных областях на странице. Это открывает возможности для верстки, более похожей на газетную.
Закладки
Многие форматы вывода для процессоров XSL FO, в частности PDF, поддерживают закладки. Они позволяют указывать строку текста в отдельном окне, которую пользователь может выбрать. При выборе закладки окно документа мгновенно прокручивается к определенному фрагменту документа. XSL FO v1.1 теперь предоставляет возможность создавать именованные закладки непосредственно в XSL FO, что позволяет процессору передавать эту информацию в выходной формат, поддерживающий такую функцию.
Индексирование
XSL FO 1.1 предоставляет возможности для создания индекса, который обычно размещается в конце книги. Это достигается за счет ссылок на правильно размеченные элементы в документе FO.
Последняя страница цитаты
Последняя страница может быть сгенерирована без явной ссылки в документе на конкретный якорь в FO-документе. Определение "последней страницы" может быть ограничено определенным диапазоном страниц или распространяться на весь документ. Это позволяет пользователю указать, например, "Страница 2 из 15", где страница 15 является номером страницы, определяющим последнюю страницу.
Маркеры для таблиц
Маркеры таблицы позволяют пользователю создавать динамический контент в заголовках и подвалах таблицы, например, итоговые значения внизу каждой страницы таблицы или индикаторы продолжения таблицы.
Внутренние/внешние плавучие устройства
XSL FO 1.1 добавляет ключевые слова "inside" и "outside" для боковых плавающих элементов, что позволяет создавать макеты страниц с маргиналиями, расположенными на внешних или внутренних полях страниц. "Inside" обозначает сторону страницы, обращенную к корешку книги, а "outside" – сторону страницы, отвернутую от корешка.
Усовершенствованный графический размер
XSL FO 1.1 расширяет функциональность для подгонки размеров графики, предоставляя возможность уменьшать изображение до заданных размеров (но не увеличивать), а также определять конкретные этапы масштабирования. Кроме того, полученный коэффициент масштабирования можно использовать для отображения (например, в подписи к рисунку: "изображение показано в 50% от фактического размера").
Преимущества
Язык XML – Поскольку это язык XML, для генерации кода XSL FO из любого XML-языка требуется только преобразование XSLT (и процессор XSLT). Можно легко написать документ в TEI или DocBook и преобразовать его в HTML для просмотра в сети или в PDF (через FO-процессор) для печати. На самом деле, существует множество готовых XSLT для TEI и DocBook для обеих этих целей. Простота использования – Еще одним преимуществом XSL FO является относительная простота освоения. Большая часть функциональности языка основана на принципах CSS, поэтому пользователь, знакомый с CSS, будет знаком с основами атрибутов разметки. Обычно довольно легко понять, как будет выглядеть конкретный раздел документа FO. Низкая стоимость – По сравнению с коммерческими системами верстки и макетирования, XSL FO может предложить гораздо более экономичное решение, если оно соответствует типографским и макетовым требованиям (см. ниже). Первоначальные затраты на внедрение невелики (могут быть нулевыми, если бесплатные реализации, такие как Apache FOP и xmlroff, удовлетворяют вашим потребностям), особенно по сравнению со стоимостью коммерческих инструментов для создания макетов. Необходимые навыки (прежде всего, программирование XSLT) широко распространены. Существует множество хороших книг по XSL FO, а также онлайн-ресурсы и активное сообщество пользователей. Многоязычность – XSL FO был разработан для поддержки всех письменных языков мира, и реализации в значительной степени достигли этой цели. Это делает XSL FO особенно подходящим для создания документов, локализованных на множество национальных языков, когда требуется единый набор инструментов для создания всех языковых версий документов. Это особенно важно для технической документации, например, для бытовой электроники, где азиатские и ближневосточные языки имеют большое значение, поскольку эти регионы представляют собой огромные рынки для мобильных телефонов и компьютерных периферийных устройств. Зрелый стандарт – С публикацией XSL FO 1.1, XSL FO зарекомендовал себя как зрелый стандарт с множеством надежных коммерческих и некоммерческих реализаций. Не существует другого сопоставимого стандарта для создания макетов страниц.
Замена
XML и HTML стандарты, вместе со стандартом CSS, поскольку CSS2 (модуль для печатных медиа) начинает предоставлять базовые возможности для печатных носителей. С CSS Paged Media Module Level 3 W3C завершает разработку единого стандарта для форматирования документов и генерации PDF-файлов. Таким образом, с 2013 года…