Перейти к основному содержимому

XSLT

Разработчику Аналитику Архитектору

Семейство XSL

ЧастьНазначение
XSLT (Transformations)XML → другой XML, HTML, текст
XPathВыбор узлов внутри XSLT
XSL-FO (Formatting Objects)Вёрстка для PDF (печать) — отдельный стек

XSLT — декларативный язык: вы описываете шаблоны «если узел такой — выведи так», а процессор обходит дерево. Это не замена общему языку программирования, но силён для отчётов, маппинга схем и публикации.

Исходный XML (данные):

<library>
<book id="1">
<title>Война и мир</title>
<author>Лев Толстой</author>
<price>450</price>
</book>
<book id="2">
<title>Мастер и Маргарита</title>
<author>Михаил Булгаков</author>
<price>380</price>
</book>
</library>

Как работает преобразование

  1. Загружается исходный XML.
  2. Загружается таблица стилей (файл .xsl, корень xsl:stylesheet).
  3. Процессор (Saxon, xslt в .NET, xsltproc, встроенный в IDE) строит дерево результата и сериализует его (HTML, XML, текст).

Пространство имён XSLT 1.0: http://www.w3.org/1999/XSL/Transform, префикс обычно xsl:.


Минимальная таблица стилей

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>Каталог</h1>
<xsl:apply-templates select="library/book"/>
</body>
</html>
</xsl:template>

<xsl:template match="book">
<p><xsl:value-of select="title"/><xsl:value-of select="author"/></p>
</xsl:template>
</xsl:stylesheet>

Ключевые элементы XSLT 1.0

xsl:template

Определяет правило для узлов, совпадающих с XPath Pattern в match:

<xsl:template match="book[@id='1']">
<em><xsl:apply-templates/></em>
</xsl:template>

match="/" — точка входа с корня документа. priority и mode разрешают конфликты нескольких шаблонов.

xsl:value-of

Вставляет строковое значение первого узла из select:

<xsl:value-of select="title"/>
<xsl:value-of select="@id"/>

xsl:for-each

Цикл по узлам, выбранным XPath:

<xsl:for-each select="library/book">
<li><xsl:value-of select="title"/></li>
</xsl:for-each>

xsl:sort

Сортировка внутри for-each или apply-templates:

<xsl:for-each select="library/book">
<xsl:sort select="title" order="ascending" data-type="text"/>
<li><xsl:value-of select="title"/></li>
</xsl:for-each>

xsl:if

Одна ветвь без else (для elsechoose):

<xsl:if test="price &gt; 400">
<span class="expensive"><xsl:value-of select="title"/></span>
</xsl:if>

В XML/XSLT символ > в атрибутах пишут как &gt; или в CDATA.

xsl:choose

<xsl:choose>
<xsl:when test="@genre='classic'">Классика</xsl:when>
<xsl:when test="@genre='novel'">Роман</xsl:when>
<xsl:otherwise>Другое</xsl:otherwise>
</xsl:choose>

xsl:apply-templates

Делегирует обработку дочерним узлам другим шаблонам (рекурсивный обход):

<xsl:template match="library">
<ul><xsl:apply-templates select="book"/></ul>
</xsl:template>

select ограничивает, какие узлы передаются; mode — альтернативный набор шаблонов.


Полный пример — HTML-список с сортировкой

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><body>
<h1>Список книг</h1>
<ul>
<xsl:for-each select="library/book">
<xsl:sort select="title"/>
<li>
<strong><xsl:value-of select="title"/></strong>
(<xsl:value-of select="author"/>)
<xsl:if test="price &gt; 400"> — премиум</xsl:if>
</li>
</xsl:for-each>
</ul>
</body></html>
</xsl:template>
</xsl:stylesheet>
Загрузка интерактивного демо…

Полный перечень элементов и атрибутов XSLT 2.0/3.0 — справочник по XSLT.


XSLT на стороне клиента

Исторически браузеры (IE, ранний Firefox) могли применять XSLT через <?xml-stylesheet type="text/xsl" href="..."?>.

Сегодня:

  • в современных браузерах поддержка XSLT ограничена или отключена;
  • для веб-UI предпочтительны серверное преобразование или сборка на этапе CI;
  • клиентский XSLT иногда встречается во внутренних корпоративных приложениях и legacy.

Практический вывод: не закладывайте XSLT в браузер как единственный способ рендера без проверки целевой среды.


XSLT на стороне сервера

Типичные сценарии:

СредаИнструмент
.NETSystem.Xml.Xsl.XslCompiledTransform
JavaJAXP Transformer, Saxon
PHPXSLTProcessor (libxslt)
CLIxsltproc, Saxon (java -jar saxon.jar)
КонвейерыПреобразование перед публикацией отчёта, EDI, СМЭВ

Преимущества сервера: контроль версий XSLT, кэширование скомпилированных таблиц, единый PDF/HTML для всех клиентов.

Пример запуска Saxon из командной строки:

java -jar saxon-he.jar -s:input.xml -xsl:transform.xsl -o:output.html

Редактирование XML и роль XSLT

Редактирование XML — это изменение исходного файла (IDE, DOM API, сериализация из кода). XSLT исходник не меняет: он создаёт производный документ.

ЗадачаПодход
Правка конфигурацииРедактор + валидация XSD
Массовая смена структурыXSLT или скрипт (Python, C#)
Просмотр для человекаXSLT → HTML или CSS к XML
Обмен между системамиXSLT как «адаптер» между двумя XSD

Связанные темы: XML, XML DOM, справочник XSLT.

Практическое задание
Добавьте в таблицу стилей шаблон, который для книг с price > 400 выводит заголовок красным (атрибут style или класс). Проверьте в демо выше.


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).