Введение

Язык для преобразования XML-документов

XSLT (Extensible Stylesheet Language Transformations) — это язык, изначально разработанный для преобразования XML-документов в другие XML-документы или другие форматы, такие как HTML для веб-страниц, обычный текст или XSL-форматирующие объекты, которые впоследствии могут быть преобразованы в другие форматы, такие как PDF, PostScript и PNG. Поддержка JSON и преобразования обычного текста была добавлена в более поздних обновлениях спецификации XSLT 1.0. По состоянию на август 2022 года, последней стабильной версией языка является XSLT 3.0, получившая статус Рекомендации в июне 2017 года. Реализации XSLT 3.0 поддерживают Java, .NET, C/C++, Python, PHP и NodeJS. Библиотека Javascript XSLT 3.0 также может быть размещена в веб-браузере. Современные веб-браузеры также включают встроенную поддержку XSLT 1.0. При преобразовании XML-документа с помощью XSLT исходный документ не изменяется, а создается новый документ на основе содержимого существующего. Как правило, входными документами являются XML-файлы, но может использоваться любой источник, из которого процессор может построить модель данных XQuery и XPath, например, таблицы реляционных баз данных или географические информационные системы.

Модель проектирования и обработки

Процессор XSLT принимает один или несколько исходных XML-документов и один или несколько таблиц стилей XSLT, обрабатывая их для создания одного или нескольких выходных документов. В отличие от широко распространенных императивных языков программирования, таких как C, XSLT является декларативным. Основной принцип обработки – сопоставление с образцом. Вместо перечисления последовательности императивных действий для выполнения в среде с состоянием, правила шаблонов определяют лишь способ обработки узла, соответствующего определенному шаблону XPath, если процессор его встретит, а содержимое шаблонов фактически представляет собой функциональные выражения, непосредственно отображающие их результат – дерево результатов, которое является основой вывода процессора. Типичный процессор работает следующим образом: сначала, предполагая, что таблица стилей уже прочитана и подготовлена, процессор строит исходное дерево из входного XML-документа. Затем он обрабатывает корневой узел исходного дерева, находит наиболее подходящий шаблон для этого узла в таблице стилей и вычисляет содержимое шаблона. Инструкции в каждом шаблоне обычно предписывают процессору либо создавать узлы в дереве результатов, либо обрабатывать другие узлы в исходном дереве тем же способом, что и корневой узел. Наконец, дерево результатов сериализуется в текст XML или HTML.

XPath

XSLT использует XPath для идентификации подмножеств дерева исходного документа и выполнения вычислений. XPath также предоставляет широкий спектр функций, которые XSLT дополнительно расширяет. XSLT 1.0 использует XPath 1.0, а XSLT 2.0 использует XPath 2.0. XSLT 3.0 будет работать как с XPath 3.0, так и с XPath 3.1. Для версий 1.0 и 2.0 спецификации XSLT и XPath были опубликованы одновременно. Однако, начиная с версии 3.0, синхронизация была нарушена: XPath 3.0 получил статус Рекомендации в апреле 2014 года, затем в феврале 2017 года последовал XPath 3.1, а XSLT 3.0 был опубликован в июне 2017 года.

Типы носителей

Элемент <output> может опционально принимать атрибут media type, который позволяет задать тип носителя (или MIME-тип) для результирующего вывода, например: <xsl:output output="xml" media type="application/xml"/>. Рекомендация XSLT 1.0 рекомендовала более общие типы атрибутов text/xml и application/xml, поскольку долгое время не существовало зарегистрированного типа носителя для XSLT. В это время text/xsl стал фактическим стандартом. В XSLT 1.0 не было определено, как следует использовать значения media type. С выпуском XSLT 2.0, в 2007 году W3C рекомендовала зарегистрировать MIME-тип application/xslt+xml, который впоследствии был зарегистрирован в Internet Assigned Numbers Authority. Предварительные рабочие версии XSLT до 1.0 использовали text/xsl в примерах встраивания, и этот тип был реализован и продолжал продвигаться Microsoft в Internet Explorer и MSXML примерно в 2012 году. Он также широко поддерживается в инструкции по обработке XML-таблиц стилей другими браузерами. На практике, пользователи, желающие управлять преобразованием в браузере с помощью этой инструкции обработки, были вынуждены использовать этот незарегистрированный тип носителя.

Выступление

Большинство ранних процессоров XSLT были интерпретаторами. В последнее время всё чаще применяется генерация кода с использованием переносимых промежуточных языков (таких как Java bytecode или NET Common Intermediate Language) в качестве целевого языка. Однако даже интерпретируемые продукты обычно предлагают отдельные фазы анализа и выполнения, что позволяет создавать оптимизированное дерево выражений в памяти и повторно использовать его для выполнения нескольких преобразований. Это обеспечивает существенный прирост производительности в приложениях для онлайн-публикации, где одно и то же преобразование применяется многократно в секунду к различным исходным документам. Это разделение отражено в архитектуре API для обработки XSLT (таких как JAXP). Ранние процессоры XSLT имели очень мало оптимизаций. Документы таблиц стилей загружались в объектные модели документов, и процессор работал с ними напрямую. Движки XPath также не были оптимизированы. Однако всё чаще процессоры XSLT используют методы оптимизации, применяемые в функциональных языках программирования и языках запросов к базам данных, такие как статическое переписывание дерева выражений (например, для вынесения вычислений за пределы циклов) и ленивое поточное вычисление для уменьшения объема памяти, необходимого для промежуточных результатов (и обеспечения "раннего выхода", когда процессор может вычислить выражение, например, `following-sibling::*[1]`, без полной оценки всех подвыражений). Многие процессоры также используют древовидные представления, которые значительно эффективнее (как по объему занимаемой памяти, так и по скорости) универсальных реализаций DOM. В июне 2014 года Дебби Локетт и Майкл Кей представили систему эталонного тестирования с открытым исходным кодом для процессоров XSLT под названием XT Speedo.