Xpoint
   [напомнить пароль]

The Extensible Stylesheet Language Transformations (XSLT)

XSLT — XML-язык, предназначенный для преобразования XML-языков друг в друга (а также в другие форматы) — один из краеугольных камней современных XML-технологий.

Оглавление

В этом разделе, помимо краткой характеристики языка, содержащийся в этом документе, имеются:

Реквизиты:

Пространство именhttp://www.w3.org/1999/XSL/Transform

Это пространство определено для всех версий XSLT. Процессоры должны отличать версии языка по аттрибуту xsl:version.

Версия 1.0

СпецификацииXSLThttp://www.w3.org/TR/xslt
XPathhttp://www.w3.org/TR/xpath
Mime-типtext/xml, application/xml, на практике используется незарегистрированный тип text/xsl

Классический XSLT 1.0 может начинаться так (в данном примере происходит преобразование в HTML):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
 exclude-result-prefixes="xsl"
 xmlns="http://www.w3.org/1999/xhtml"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:stylesheet>

Версия 1.1

Спецификацияhttp://www.w3.org/TR/xslt11/ — WD, разработка остановлена
Mime-типtext/xml, application/xml

Версия 2.0

СпецификацииXSLThttp://www.w3.org/TR/xslt20/
XPathhttp://www.w3.org/TR/xpath20/
Ф-цииhttp://www.w3.org/TR/xpath-functions/
Схемаhttp://www.w3.org/2005/11/schema-for-xslt20.xsd
Mime-типapplication/xslt+xml

История создания. Версии языка.

Предыстория

После того, как W3C разработалa стандарт XML, стала очевидной необходимость создания механизма представления XML-документов. CSS был достаточно слабым инструментом, кроме того, от нового языка стилей требовалось, среди прочего, возможность применения к себе самому, т.е. он должен был быть написан на XML.

За основу нового языка XSL (Extensible Stylesheet Language) был взят DSSSL — Lisp-подобный язык, который использовался для представления SGML.

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

Однако уже в первые месяцы разработки выяснилось, что создаются фактически два разных языка:

  • язык для представления документов (своего рода XML-аналог TeX или PostScript);
  • язык для преобразования произвольного XML к виду означенного представления.

В результате в декабре 1998 проект был разделен на две части.

Язык для представления документов получил имя XSL-FO, после долгих мучений через 3 года получил статус рекомендации, и используется в основном для генерации PDF.

Нетривиальная эта задача — представление документов с типографическим качеством... А втoрого Дональда Кнута среди разработчиков явно не наблюдалось...

Язык для преобразования XML назвали XSLT (XSL Transformations). Он был готов менее чем через год (в ноябре 1999), но еще до этого произошли следующие события:

  • В рамках XSLT был разработан язык адресации отдельных частей XML-документа. Как выяснилось, он имел немалую ценность сам по себе — в частности, решал задачу, поставленную в рамках проекта XPointer. Потому в апреле 1999 года из XSLT был выделен отдельный проект — XPath.
  • Небезызвестная фирма Microsoft проявила к языку свой нездоровый интерес. Нездоровый — потому что MS не стала ждать, пока будет готова рекомендация (или хотя бы пока язык не станет более-менее стабильным), а использовала для своих продуктов крайне сырой черновой вариант спецификации. Как результат — пользователи MS получили проблемы на долгие годы вперед, потому что внедрить левую версию языка оказалось просто, а вот заменить ее потом на нормальную — уже гораздо сложнее...

XSLT 1.0. Проблема RTF.

После выхода XSLT 1.0 очень скоро выяснилось, что он имеет серьезные недостатки. Главной из их была невозможность создания временных деревьев. Действително, если мы напишем что-то вроде:

<xsl:variable name="nodes">
  <foo name="bar"/>
  <bar name="foo"/>
</xsl:variable>

То это переменная будет иметь тип result tree fragment, который нельзя преобразовать в node-set. Иными словами — выражение XPath $nodes/foo/@name вызовет ошибку.

Почему разработчики из W3C запретили прeобразование RTF → node-set, и зачем они вообще ввели этот самый RTF — для меня остается загадкой...

Среди других проблем первой версии можно назвать:

  • Неспособность нормально работать с пространствами имен.
  • Неспособность получать в результате преобразования несколько документов.
  • Неспособность нормально выводить сущности XML.
  • Крайне бедный арсенал средств работы с текстом.
  • И многие другие...

XSLT 1.1 и его крах

Для преодоления этих недостатков был разработан стандарт XSLT 1.1, в котором не было RTF, а переменные, подобные вышеприведенной, имели тип node-set. Но, в августе 2001, когда он уже был практически готов, W3C заморозила все работы в этом направлении и переключилась на XSLT 2.0. Это обосновывалось тем, что назрела необходимость серьезных изменений в XPath для обеспечения его совместимости с XML Schema. Как результат — разработка XPath 2.0 тянется уже пять лет, и конца ей не виндо. Лишь совсем недавно она достигла стадии «Candidate Recommendation».

Опять-таки, мотивации W3C здесь довольно туманны. Ну, основывался бы XSLT 1.1 на XPath 1.0, a XSLT 2.0 — разрабатывался отдельно. Имели бы сейчас XSLT 1.1 как промышленный стандарт...

Но оставим на время обсужение политики W3C в области дальнейших версий. Вернемся к версии 1.0, которая пока остается базовой, и поглядим, какие решения проблемы RTF существуют на текущий момент.

Процессорно-зависимые расширения XSLT.

Естественно, каждый разработчик процессора стремился по мере своих сил ликвидировать указанный недостаток. Как результат — практически во всех процессорах появилась функция с названием вроде nodeset или node-set. Проблема в том, что каждый процессор называл ее по-своему. И у разработчика, который захотел бы написать переносимый код, возникла бы необходимость проверять наличие бесчисленных nodeset, node-set, msxml:node-set, xalan:nodeset, xt:node-set и т.д.

Заметим, что с другими функциями расширений, коих появилось несметное множество, дело обстояло не лучше.

Инициатива EXSLT.

Для наведения в этом деле хоть какого-то порядка, была создана инициативная группа EXSLT (http://www.exslt.org).

Этой группой была проделана огромная работа по классификации расширений и приведении их к единому стандарту. Естественно, одной из первых шла функция exsl:node-set.

В настоящее время она поддерживается большинством процессоров. Их полный список доступен по адресу http://www.exslt.org/exsl/functions/node-set/exsl.node-set.html

Надо ли говорить, что процессор фирмы Microsoft в это число не входит...

Использовать exsl:node-set можно следующим образом:

<xsl:stylesheet version="1.0"
  exclude-result-prefixes="xsl exsl"
  xmlns:exsl="http://exslt.org/common"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  extension-element-prefixes="exsl"
 >

<xsl:variable name="nodes">
  <foo name="bar"/>
  <bar name="foo"/>
</xsl:variable>

<xsl:template match="/">
  <xsl:apply-templates select="exsl:node-set($nodes) / foo"/>
</xsl:template>

<!-- ... -->

И тем не менее, нужно явно отдавать себе отчет, что это — костыль.

Настоящее. XSLT 2.0 и XQuery.

Как уже отмечалось, несколько месяцев назад (в ноябре 2005 года) многострадальный стандарт XSLT 2.0 получил, наконец, статус «Candidate Recommendation». Это означает, что есть надежда на скорый (возможно, уже в этом году) выход рекомендации.

Что можно отметить — все перечисленные проблемы, свойственные версии 1.0, здесь решены. RTF нет, можно работать с множеством выходых документов, с пространствами имен, с сущностями и нестандартными тегами (ASP, JSP, etc.), существует огромное количество функций — вплоть до регулярных выражений, можно писать свои функции и многое другое. Желающих узнать подробности отсылаю к спецификации.

Стоит отметить еще один факт. За все те годы, в течение которых шла работа над второй версией, количество порожденных языков — а главное, связанных с ними спецификаций — возросло до совершенно неприемлимых размеров. В сообщении в новостях W3C о выходе новой версии их список занимает целую страницу. Между тем, помимо XSLT 2.0 и XPath 2.0, среди этой кучи макулатуры этих документов есть, все же, нечто, заслуживающее пристального внимания.

Это http://www.w3.org/TR/xquery/ — спецификация XQuery, языка запросов к XML-данным, созданного на основе XPath. В принципе, этот язык обладает практически теми же возможностями, что и XSLT, но во многих случаях (особенно, когда в XML хранятся данные, а не текст) позволяет решить целый класс задач существенно быстрее.

Применение XSLT

TODO: Добавление стиля XSLT в XML-документ

TODO: Возможности браузеров по работе с XSLT

XSLT-процессоры

Saxon
Xalan
libxslt
Sablotron
MSXML
Transformiix
Altova XSLT 1.0/2.0

TODO: подробности работы

TODO: Работа с XSLT в языках программирования

Ресурсы

Английский

Русский

  • http://www.raleigh.ru/TR/ — перевод стандартов XSLT 1.0 и XPath 1.0
  • http://www.raleigh.ru/tutorials/ — перевод учебных материалов по XML/XSLT
  • http://xmlhack.ru/books/xslt/ — фрагменты книги А. Валикова «Технология XSLT»
  • http://www.xml.nsu.ru/ — переводы материалов по XML/XSLT, в т.ч. главы из «XML Bible» E. Harold. Сам сайт сделан на XML, XSLT и SVG (местами, к сожалению, невалидном), и может сам по себе служить пособием.

TODO: добавить ссылок...

Powered by POEM™ Engine Copyright © 2002-2005