XSLT - XSLT

XSLT
Парадигма Декларативная
Разработчик Консорциум World Wide Web (W3C)
Впервые появился 1998 г.
Стабильный выпуск
3.0 / 8 июня 2017 г . ; 3 года назад  ( 2017-06-08 )
Расширения имени файла .xslt
Веб-сайт www .w3 .org / TR / xslt-30 /
Основные реализации
libxslt , саксонский , Xalan
Под влиянием
DSSSL

XSLT ( Extensible Stylesheet Language Transformations ) - это язык для преобразования XML- документов в другие XML-документы или другие форматы, такие как HTML для веб-страниц , обычный текст или объекты форматирования XSL , которые впоследствии могут быть преобразованы в другие форматы, такие как PDF , PostScript. и PNG . XSLT 1.0 широко поддерживается современными веб-браузерами.

Исходный документ не изменяется; скорее, новый документ создается на основе содержания существующего. Как правило, входные документы представляют собой файлы XML, но можно использовать все, на основе чего процессор может построить модель данных XQuery и XPath , например таблицы реляционных баз данных или географические информационные системы .

Хотя XSLT разработан как язык специального назначения для преобразования XML, этот язык является полным по Тьюрингу , что делает его теоретически пригодным для произвольных вычислений.

История

На XSLT влияют функциональные языки и языки сопоставления текстовых шаблонов, такие как SNOBOL и AWK . Его прямым предшественником является DSSSL , который сделал для SGML то же, что XSLT для XML.

  • XSLT 2.0: после неудачной попытки создать версию 1.1 в 2001 году рабочая группа XSL объединила усилия с рабочей группой XQuery для создания XPath 2.0 с более богатой моделью данных и системой типов, основанной на схеме XML . Основываясь на этом, XSLT 2.0, разработанный под редакцией Майкла Кея , получил статус рекомендации в январе 2007 года. К наиболее важным нововведениям в XSLT 2.0 относятся:
    • Обработка строк с помощью регулярных выражений
    • Функции и операторы для управления датами, временем и продолжительностью
    • Множественные выходные документы
    • Группировка (создание иерархической структуры из плоских входных последовательностей)
    • Более богатая система типов и более строгая проверка типов
  • XSLT 3.0: стал рекомендацией W3C 8 июня 2017 года. Основные новые функции:
    • Потоковые преобразования : в предыдущих версиях весь входной документ должен был быть считан в память, прежде чем он мог быть обработан, а выходные данные не могли быть записаны до завершения обработки. XSLT 3.0 позволяет выполнять потоковую передачу XML, что полезно для обработки документов, слишком больших для размещения в памяти, или когда преобразования связаны в конвейерах XML .
    • Пакеты для улучшения модульности больших таблиц стилей.
    • Улучшена обработка динамических ошибок, например, с помощью инструкции xsl: try.
    • Поддержка карт и массивов, позволяющая XSLT обрабатывать JSON, а также XML.
    • Функции теперь могут быть аргументами для других функций (высшего порядка).

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

Схема основных элементов и последовательности операций преобразования расширяемого языка таблиц стилей.

Процессор 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 или 3.1. В случае версий 1.0 и 2.0 спецификации XSLT и XPath были опубликованы в один и тот же день. Однако в версии 3.0 они больше не синхронизировались; XPath 3.0 стал Рекомендацией в апреле 2014 года, а в феврале 2017 года - XPath 3.1; XSLT 3.0 последовал в июне 2017 года.

XQuery по сравнению

Функции XSLT частично совпадают с функциями XQuery , который изначально задумывался как язык запросов для больших коллекций XML-документов.

Стандарты XSLT 2.0 и XQuery 1.0 были разработаны отдельными рабочими группами в W3C , работая вместе, чтобы обеспечить единый подход там, где это необходимо. Они используют одну и ту же модель данных, систему типов и библиотеку функций, и оба включают XPath 2.0 в качестве подъязыка.

Однако два языка уходят корнями в разные традиции и служат нуждам разных сообществ. XSLT изначально задумывался как язык таблиц стилей, основной целью которого было отображение XML для человека, читающего на экране, в Интернете (как язык веб-шаблонов ) или на бумаге. XQuery изначально задумывался как язык запросов к базе данных в традициях SQL .

Поскольку два языка происходят из разных сообществ, XSLT лучше справляется с описательными документами с более гибкой структурой, а XQuery лучше справляется с обработкой данных, например, при выполнении реляционных соединений.

Типы медиа

<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 W3C рекомендовал регистрацию типа носителя MIME, application/xslt+xml и позже он был зарегистрирован в Internet Assigned Numbers Authority .

В text/xsl примерах внедрения использовались рабочие проекты XSLT до версии 1.0 , и этот тип был реализован и продолжает продвигаться Microsoft в Internet Explorer и MSXML. Это также широко используется в xml-stylesheet инструкциях по обработке в других браузерах. Таким образом, на практике пользователи, желающие управлять преобразованием в браузере с помощью этой инструкции обработки, обязаны использовать этот незарегистрированный тип носителя.

Примеры

В этих примерах используется следующий входящий XML-документ

<?xml version="1.0" ?>
<persons>
  <person username="JS1">
    <name>John</name>
    <family-name>Smith</family-name>
  </person>
  <person username="MI1">
    <name>Morka</name>
    <family-name>Ismincius</family-name>
  </person>
</persons>

Пример 1 (преобразование XML в XML)

Эта таблица стилей 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:stylesheet>

Результатом его оценки является новый XML-документ с другой структурой:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <name username="JS1">John</name>
  <name username="MI1">Morka</name>
</root>

Пример 2 (преобразование XML в XHTML)

Обработка следующего примера файла XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="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>Testing XML Example</title> </head>
      <body>
        <h1>Persons</h1>
        <ul>
          <xsl:apply-templates select="person">
            <xsl:sort select="family-name" />
          </xsl:apply-templates>
        </ul>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="person">
    <li>
      <xsl:value-of select="family-name"/><xsl:text>, </xsl:text><xsl:value-of select="name"/>
    </li>
  </xsl:template>

</xsl:stylesheet>

с входным XML-файлом, показанным выше, приводит к следующему XHTML ( здесь для ясности исправлены пробелы ):

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head> <title>Testing XML Example</title> </head>
  <body>
    <h1>Persons</h1>
      <ul>
        <li>Ismincius, Morka</li>
        <li>Smith, John</li>
      </ul>
  </body>
</html>

Этот XHTML генерирует вывод, показанный ниже, при отображении в веб-браузере.

Визуализированный XHTML, созданный из входного XML-файла и преобразования XSLT.

Чтобы веб-браузер мог применить преобразование XSL к отображаемому XML-документу, в XML можно вставить инструкцию обработки таблицы стилей XML. Так, например, если таблица стилей в Примере 2 выше была доступна как «example2.xsl», к исходному входящему XML можно было бы добавить следующую инструкцию:

<?xml-stylesheet href="example2.xsl" type="text/xsl" ?>

В этом примере text/xsl это технически неверно в соответствии со спецификациями W3C (в которых говорится, что тип должен быть application/xslt+xml ), но это единственный тип носителя, который широко поддерживается браузерами с 2009 года, а в 2021 году ситуация не изменится.

Реализации процессора

  • RaptorXML от Altova - это процессор XSLT 3.0, доступный в наборе инструментов разработки XMLSpy и как отдельная реализация сервера, вызываемая с помощью интерфейса REST.
  • IBM предлагает обработку XSLT, встроенную в специализированное аппаратное устройство под брендом Datapower .
  • libxslt - это бесплатная библиотека, выпущенная под лицензией MIT, которую можно повторно использовать в коммерческих приложениях. Он основан на libxml и реализован на C для обеспечения скорости и переносимости. Он поддерживает расширения XSLT 1.0 и EXSLT .
  • Microsoft предоставляет два процессора XSLT (только оба XSLT 1.0). Более ранний процессор MSXML предоставляет COM-интерфейсы; из MSXML 4.0 он также включает утилиту командной строки msxsl.exe . Среда выполнения .NET включает в свою System.Xml.Xsl библиотеку отдельный встроенный процессор XSLT .
  • Saxon - это процессор XSLT 3.0 и XQuery 3.1 с открытым исходным кодом и проприетарными версиями для автономной работы и для Java , JavaScript и .NET. Отдельный продукт Saxon-JS предлагает обработку XSLT 3.0 на Node.js и в браузере.
  • Xalan - это процессор XSLT 1.0 с открытым исходным кодом от Apache Software Foundation, доступный для Java и C ++. Вариант процессора Xalan включен в качестве процессора XSLT по умолчанию в стандартный дистрибутив Java от Oracle.
  • Веб-браузеры: Safari, Chrome, Firefox, Opera и Internet Explorer поддерживают XSLT 1.0 (только). Браузеры могут выполнять преобразования файлов XML на лету и отображать выходные данные преобразования в окне браузера. Это делается либо путем встраивания XSL в документ XML, либо путем ссылки на файл, содержащий инструкции XSL, из документа XML. Последний может не работать с Chrome для файлов из локальной файловой системы из-за его модели безопасности.

Представление

Большинство ранних XSLT-процессоров были интерпретаторами. В последнее время генерация кода становится все более распространенной с использованием переносимых промежуточных языков (таких как байт-код Java или общий промежуточный язык .NET ) в качестве целевого. Однако даже интерпретирующие продукты обычно предлагают отдельные фазы анализа и выполнения, что позволяет создавать оптимизированное дерево выражений в памяти и повторно использовать для выполнения нескольких преобразований. Это дает существенные преимущества в производительности в приложениях для онлайн-публикации, где одно и то же преобразование применяется много раз в секунду к разным исходным документам. Это разделение отражено в конструкции API-интерфейсов обработки XSLT (таких как JAXP ).

В ранних XSLT-процессорах было очень мало оптимизаций. Документы таблиц стилей считывались в объектных моделях документов, и обработчик воздействовал на них напрямую. Движки XPath также не были оптимизированы. Однако все чаще XSLT-процессоры используют методы оптимизации, имеющиеся в функциональных языках программирования и языках запросов к базам данных, такие как статическое переписывание дерева выражений (например, для вывода вычислений из циклов) и ленивое конвейерное вычисление для уменьшения объема памяти, занимаемого промежуточными результатами. (и разрешить «ранний выход», когда процессор может оценить выражение, например, following-sibling::*[1] без полной оценки всех подвыражений). Многие процессоры также используют представления в виде дерева, которые значительно более эффективны (как в пространстве, так и во времени), чем реализации DOM общего назначения.

В июне 2014 года Дебби Локетт и Майкл Кей представили платформу тестирования производительности с открытым исходным кодом для процессоров XSLT под названием XT-Speedo.

Смотрите также

Рекомендации

дальнейшее чтение

Внешние ссылки

Документация
Библиотеки кода XSLT
  • EXSLT - это широко распространенная инициатива сообщества по предоставлению расширений XSLT.
  • FXSL - это библиотека, реализующая поддержку функций высшего порядка в XSLT. FXSL написан на самом XSLT.
  • Стандартная библиотека XSLT xsltsl предоставляет разработчику XSLT набор шаблонов XSLT для часто используемых функций. Они реализованы исключительно в XSLT, то есть не используют никаких расширений. xsltsl - это проект SourceForge.
  • Kernow Графический пользовательский интерфейс для Saxon, который предоставляет интерфейс «укажи и щелкни» для запуска преобразований.
  • xslt.js - преобразование XML с помощью библиотеки XSLT JavaScript, которая преобразует XML с помощью XSLT в браузере.