Парадигма | Декларативный |
---|---|
Разработчик | Консорциум Всемирной паутины (W3C) |
Впервые появился | 1998 |
Стабильный релиз | 3.0 / 8 июня 2017 г. ( 2017-06-08 ) |
Расширения имени файла | .xslt |
Веб-сайт | www.w3.org/TR/xslt-30/ |
Основные внедрения | |
libxslt , саксонский , ксаланский | |
Под влиянием | |
DSSSL |
Расширение имени файла | .xslt |
---|---|
Тип интернет-СМИ | приложение/xslt+xml |
Единый идентификатор типа (UTI) | org.w3.xsl |
XSLT ( Extensible Stylesheet Language Transformations ) — язык, изначально разработанный для преобразования XML- документов в другие XML-документы [1] или другие форматы, такие как HTML для веб-страниц , простой текст или объекты форматирования XSL . Эти форматы впоследствии можно преобразовать в такие форматы, как PDF , PostScript и PNG . [2] Поддержка преобразования JSON и простого текста была добавлена в более поздних обновлениях спецификации XSLT 1.0.
По состоянию на август 2022 года [обновлять]последней стабильной версией языка является XSLT 3.0, получившая статус рекомендации в июне 2017 года.
Реализации XSLT 3.0 поддерживают Java, .NET, C/C++, Python, PHP и NodeJS. Библиотека XSLT 3.0 JavaScript также может быть размещена в веб-браузере. Современные веб-браузеры также включают встроенную поддержку XSLT 1.0. [3]
Преобразование документа XSLT определяет, как преобразовать XML-документ в новый документ (обычно XML, но поддерживаются и другие форматы, такие как простой текст). [4] Обычно входные документы представляют собой XML-файлы, но можно использовать все, из чего процессор может построить XQuery и модель данных XPath , например, таблицы реляционных баз данных или географические информационные системы . [1]
Хотя XSLT изначально был разработан как специализированный язык для преобразования XML, этот язык является полным по Тьюрингу , что делает его теоретически способным выполнять произвольные вычисления. [5]
XSLT находится под влиянием функциональных языков [6] и текстовых языков сопоставления шаблонов, таких как SNOBOL и AWK . Его самым непосредственным предшественником является DSSSL , который сделал для SGML то, что XSLT делает для XML. [7]
Процессор XSLT берет один или несколько исходных документов XML, а также одну или несколько таблиц стилей XSLT и обрабатывает их для создания одного или нескольких выходных документов. [16] [17] В отличие от широко распространенных императивных языков программирования, таких как C , XSLT является декларативным . [18] Базовой парадигмой обработки является сопоставление с образцом. [19] Вместо того, чтобы перечислять императивную последовательность действий для выполнения в среде с сохранением состояния, правила шаблонов определяют только то, как обрабатывать узел, соответствующий определенному шаблону, подобному XPath, если процессор должен столкнуться с ним, а содержимое шаблонов фактически включает функциональные выражения , которые напрямую представляют их оценочную форму: результирующее дерево, которое является основой вывода процессора.
Типичный процессор ведет себя следующим образом. Сначала, предполагая, что таблица стилей уже прочитана и подготовлена, процессор строит исходное дерево из входного XML-документа. Затем он обрабатывает корневой узел исходного дерева, находит наиболее подходящий шаблон для этого узла в таблице стилей и оценивает содержимое шаблона. Инструкции в каждом шаблоне обычно предписывают процессору либо создать узлы в результирующем дереве, либо обработать больше узлов в исходном дереве таким же образом, как и корневой узел. Наконец, результирующее дерево сериализуется как XML или HTML-текст.
XSLT использует XPath для идентификации подмножеств исходного дерева документа и выполнения вычислений. XPath также предоставляет ряд функций , которые сам XSLT дополнительно расширяет.
XSLT 1.0 использует XPath 1.0, тогда как XSLT 2.0 использует XPath 2.0. XSLT 3.0 будет работать как с XPath 3.0, так и с 3.1. В случае 1.0 и 2.0 спецификации XSLT и XPath были опубликованы в один и тот же день. Однако с 3.0 они больше не были синхронизированы; XPath 3.0 стал Рекомендацией в апреле 2014 года, за ним последовал XPath 3.1 в феврале 2017 года; XSLT 3.0 последовал в июне 2017 года.
Функциональные возможности XSLT пересекаются с функциональными возможностями XQuery , который изначально задумывался как язык запросов для больших коллекций XML-документов.
Стандарты XSLT 2.0 и XQuery 1.0 были разработаны отдельными рабочими группами в W3C , которые работали вместе, чтобы обеспечить общий подход там, где это уместно. Они используют одну и ту же модель данных, систему типов и библиотеку функций, и оба включают XPath 2.0 в качестве подъязыка.
Однако эти два языка укоренены в разных традициях и служат нуждам разных сообществ. XSLT изначально задумывался как язык таблиц стилей, чьей главной целью было отображение XML для человека на экране, в Интернете (как язык веб-шаблонов ) или на бумаге. XQuery изначально задумывался как язык запросов к базе данных в традициях SQL .
Поскольку эти два языка возникли в разных сообществах, XSLT лучше справляется с обработкой повествовательных документов с более гибкой структурой, в то время как XQuery лучше справляется с обработкой данных, например, при выполнении реляционных объединений. [20]
Элемент <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
[21] , и позднее он был зарегистрирован в Internet Assigned Numbers Authority . [22]
Рабочие проекты XSLT до версии 1.0 использовались text/xsl
в примерах внедрения, и этот тип был реализован и продолжал продвигаться Microsoft в Internet Explorer [23] и MSXML около 2012 года. Он также широко признан в xml-stylesheet
инструкции по обработке другими браузерами. Поэтому на практике пользователи, желающие управлять преобразованием в браузере с помощью этой инструкции по обработке, были вынуждены использовать этот незарегистрированный тип носителя. [24]
В этих примерах используется следующий входящий XML-документ:
<?xml version="1.0" ?> <persons> <person username= "JS1" > <name> Джон </name> <family-name> Смит </family-name> </person> <person username= "MI1" > <name> Морка </name> <family-name> Исминций </family-name> </person> </persons>
Эта таблица стилей XSLT предоставляет шаблоны для преобразования XML-документа:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version= "1.0" > <xsl:output method= "xml" indent= "yes" /> <xsl:template match= "/persons" > <root> <xsl:apply-templates select= "person" /> </root> </xsl:template> <xsl:template match= "person" > <name username= "{@username}" > <xsl:value-of select= "name" /> </name> </xsl:template> </xsl:таблица стилей>
Результатом его оценки является новый XML-документ, имеющий другую структуру:
<?xml version="1.0" encoding="UTF-8"?> <root> <name username= "JS1" > Джон </name> <name username= "MI1" > Морка </name> </root>
Обработка следующего примера файла XSLT
<?xml версия="1.0" кодировка="UTF-8"?> <xsl:stylesheet версия= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" xmlns= "http://www.w3.org/1999/xhtml" > <xsl:output method= "xml" indent= "yes" encoding= "UTF-8" /> <xsl:template match= "/persons" > <html> <head> <title> Пример тестирования XML </title> </head> <body> <h1> Лица </h1> <ul> <xsl:apply-templates select= "person" > <xsl:sort select= "family-name" /> </xsl:apply-templates> </ul> </body> </html> </xsl:template> <xsl:template match= "человек" > <li> <xsl:value-of select= "фамилия-имя" /><xsl:text> , </xsl:text><xsl:value-of select= "имя" /> </li> </xsl:template> </xsl:таблица стилей>
с входным файлом XML, показанным выше, получается следующий XHTML ( пробелы здесь были скорректированы для ясности):
<?xml version="1.0" encoding="UTF-8"?> <html xmlns= "http://www.w3.org/1999/xhtml" > <head> <title> Пример тестирования XML </title> </head> <body> <h1> Лица </h1> <ul> <li> Исминий, Морка </li> <li> Смит, Джон </li> </ul> </body> </html>
При отображении в веб-браузере этот XHTML-код генерирует следующий вывод.
Для того, чтобы веб-браузер мог применить преобразование XSL к отображаемому XML-документу, в XML можно вставить инструкцию обработки таблицы стилей XML. Так, например, если таблица стилей в примере 2 выше была доступна как "example2.xsl", к исходному входящему XML можно было бы добавить следующую инструкцию: [25]
<?xml-stylesheet href="example2.xsl" type="text/xsl" ?>
В этом примере text/xsl
технически некорректен согласно спецификациям W3C [25] (в которых говорится, что тип должен быть application/xslt+xml
), но это единственный тип носителя, который широко поддерживается браузерами по состоянию на 2009 год, и ситуация не изменилась в 2021 году.
msxsl.exe
. [38] Среда выполнения .NET включает в свою библиотеку отдельный встроенный процессор XSLT System.Xml.Xsl
.Большинство ранних процессоров XSLT были интерпретаторами. В последнее время все более распространенной становится генерация кода с использованием переносимых промежуточных языков (таких как байт-код Java или .NET Common Intermediate Language ) в качестве цели. Однако даже интерпретирующие продукты обычно предлагают отдельные фазы анализа и выполнения, позволяя создавать оптимизированное дерево выражений в памяти и повторно использовать его для выполнения нескольких преобразований. Это дает существенные преимущества в производительности в приложениях онлайн-публикаций, где одно и то же преобразование применяется много раз в секунду к разным исходным документам. [42] Это разделение отражено в дизайне API обработки XSLT (таких как JAXP ).
Ранние процессоры XSLT имели очень мало оптимизаций. Документы таблиц стилей считывались в объектные модели документов , и процессор действовал с ними напрямую. Движки XPath также не были оптимизированы. Однако все чаще процессоры XSLT используют методы оптимизации, найденные в функциональных языках программирования и языках запросов к базам данных, такие как статическая перезапись дерева выражений (например, для перемещения вычислений из циклов) и ленивая конвейерная оценка для уменьшения объема памяти, занимаемого промежуточными результатами (и допускают «ранний выход», когда процессор может оценить выражение, например, following-sibling::*[1]
без полной оценки всех подвыражений). Многие процессоры также используют древовидные представления, которые значительно более эффективны (как в пространстве, так и во времени) [43], чем реализации DOM общего назначения.
В июне 2014 года Дебби Локетт и Майкл Кей представили среду для сравнительного анализа производительности с открытым исходным кодом для процессоров XSLT под названием XT-Speedo. [44]
Пример: Документы с несколькими результатами
XSLT — очень специализированный язык с ярко выраженным декларативным оттенком.
{{cite journal}}
: CS1 maint: DOI неактивен по состоянию на ноябрь 2024 г. ( ссылка ){{cite journal}}
: CS1 maint: DOI неактивен по состоянию на ноябрь 2024 г. ( ссылка )