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>
Как работает преобразование
- Загружается исходный XML.
- Загружается таблица стилей (файл
.xsl, кореньxsl:stylesheet). - Процессор (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 (для else — choose):
<xsl:if test="price > 400">
<span class="expensive"><xsl:value-of select="title"/></span>
</xsl:if>
В XML/XSLT символ > в атрибутах пишут как > или в 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 > 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 на стороне сервера
Типичные сценарии:
| Среда | Инструмент |
|---|---|
| .NET | System.Xml.Xsl.XslCompiledTransform |
| Java | JAXP Transformer, Saxon |
| PHP | XSLTProcessor (libxslt) |
| CLI | xsltproc, 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 или класс). Проверьте в демо выше.См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Форматы хранения настроек и данных. Организация данных в текстовых файлах. Текстовые форматы данных - представление информации в виде последовательностей символов для обмена и человекочитаемой обработки. Не путать с цифрами в окружении — ① (U+2460) — это circled digit one, не эмодзи (Emoji=No). Шрифт как цифровая реализация гарнитуры - контуры символов, метрики и отличие от понятия «начертание». Универсальный язык разметки — синтаксис, пространства имён, валидация XSD, CSS и связь с XPath, XSLT и DOM. Примечание — xN означает шестнадцатеричное представление Unicode-кода символа. XSLT-таблица — это XML-документ (обычно с пространством имён http — //www.w3.org/1999/XSL/Transform, сокращённо xsl — ). Корневой элемент — или (синонимы). Язык путей XML — узлы, оси, предикаты, операторы и практические запросы к дереву документа. Модель документа XML — типы узлов, коллекции, обход дерева и навигация в API. MessagePack, BSON, Protocol Buffers и CBOR — когда выбирать бинарную сериализацию вместо JSON и YAML в API и очередях. JSON как текстовый формат обмена данными между системами, основанный на объектах и массивах с явной структурой. Ключи и значения разделяются двоеточием ( — ), за которым следует пробел.Конфигурационные данные в текстовых форматах
Текстовые форматы представления данных
Справочник по эмодзи
Шрифты
XML
Справочник по XML
Справочник по XSLT
XPath
XML DOM
Бинарные форматы обмена данными
JSON
YAML