XSLT для начинающих: основы, примеры и преобразование XML
#Веб-разработкаДля кого эта статья:
- Разработчики и инженеры, работающие с XML-документами
- Студенты и специалисты, изучающие технологии веб-разработки и обработки данных
- Профессионалы, занимающиеся интеграцией систем и преобразованием данных в различные форматы
Представьте: у вас есть данные в XML, но нужно отобразить их на веб-странице, преобразовать в JSON или создать CSV-отчёт. Как это сделать без ручного перебора каждого элемента? 🔄 Здесь на помощь приходит XSLT — настоящий швейцарский нож трансформации XML-данных. Если вы когда-либо сталкивались с задачей преобразования структурированных данных из одного формата в другой, но терялись в обилии инструментов, эта статья станет вашей отправной точкой в мир XML-преобразований, от базовых концепций до практических примеров.
Что такое XSLT: базовые принципы работы с XML
XSLT (eXtensible Stylesheet Language Transformations) — это язык, созданный специально для преобразования XML-документов в другие форматы: HTML, текст, другой XML или практически любой текстовый формат. Если представить XML как структурированные данные, то XSLT — это набор правил, описывающих, как эти данные должны быть представлены.
Основная идея XSLT заключается в том, что мы описываем шаблоны (templates), которые применяются к различным частям XML-документа. Когда процессор XSLT находит соответствие между шаблоном и элементом XML, он выполняет указанные в шаблоне действия.
Сергей Ковалёв, технический лид Когда я только начинал работать с корпоративными системами, мне дали задачу: интегрировать данные из старой системы учёта, которая выгружала информацию только в XML, с новым веб-интерфейсом. Первый месяц я пытался парсить эти файлы вручную на PHP, создавая море кода и постоянно сталкиваясь с ошибками. Затем коллега показал мне XSLT, и я переписал всю логику всего за два дня. Ключевым открытием стало понимание, что XSLT — это декларативный язык: вместо того, чтобы указывать компьютеру "как" делать преобразование, я просто описал, "что" должно получиться. Спустя 5 лет эта трансформация до сих пор работает без единой ошибки, хотя формат исходных данных менялся уже трижды.
Для понимания места XSLT в экосистеме XML, рассмотрим таблицу основных XML-технологий:
| Технология | Назначение | Взаимодействие с XSLT |
|---|---|---|
| XML | Язык разметки данных | Исходный формат данных для XSLT |
| XPath | Язык запросов к XML | Используется в XSLT для выбора узлов XML |
| XSLT | Язык трансформации XML | – |
| XSL-FO | Форматирование XML для печати | XSLT часто используется для генерации XSL-FO |
| DTD/XSD | Схемы валидации XML | Определяют структуру XML для преобразования |
Процесс преобразования XSLT происходит следующим образом:
- XSLT-процессор получает исходный XML-документ
- Процессор применяет правила из XSLT-таблицы стилей
- На выходе формируется новый документ в целевом формате
Важно понимать, что XSLT не изменяет исходный XML-файл — он создаёт новый документ на основе правил преобразования. 🔍 Это делает XSLT безопасным для работы с исходными данными.

Синтаксис XSLT: основные элементы и конструкции
Таблица стилей XSLT представляет собой XML-документ с корневым элементом <xsl:stylesheet> (или <xsl:transform>, что эквивалентно). Внутри этого элемента располагаются шаблоны, определяющие правила преобразования.
Ключевые элементы синтаксиса XSLT:
<xsl:template>— определяет шаблон для преобразования<xsl:apply-templates>— применяет шаблоны к дочерним элементам<xsl:value-of>— извлекает значение узла<xsl:for-each>— перебирает набор узлов<xsl:if>и<xsl:choose>— условное форматирование<xsl:sort>— сортировка узлов
Рассмотрим базовый пример XML-документа:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Война и мир</title>
<author>Лев Толстой</author>
<year>1869</year>
</book>
<book>
<title>Мастер и Маргарита</title>
<author>Михаил Булгаков</author>
<year>1967</year>
</book>
</books>
И соответствующую XSLT-таблицу стилей для преобразования его в HTML:
<?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>
<head>
<title>Список книг</title>
</head>
<body>
<h1>Каталог книг</h1>
<table border="1">
<tr>
<th>Название</th>
<th>Автор</th>
<th>Год издания</th>
</tr>
<xsl:apply-templates select="books/book"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
В этом примере важно обратить внимание на несколько моментов:
- Атрибут
match="/"в первом шаблоне указывает, что он применяется к корневому узлу документа - Элемент
<xsl:apply-templates>с атрибутомselect="books/book"указывает процессору обработать все элементыbookвнутриbooks - Второй шаблон с
match="book"определяет, как преобразовывать каждую книгу в таблицу - Элемент
<xsl:value-of>извлекает текстовое содержимое указанного узла
Важной составляющей XSLT является язык XPath, используемый для навигации по элементам XML. XPath позволяет указывать путь к элементам и атрибутам документа, а также выполнять фильтрацию и условный выбор узлов. 🧭
Создание первого XSLT-преобразования: пошаговый гайд
Давайте создадим простое XSLT-преобразование с нуля, пройдя через все этапы этого процесса. Для примера возьмём XML-файл с данными о сотрудниках и преобразуем его в HTML-страницу.
Шаг 1: Подготовим исходный XML-документ (employees.xml):
<?xml version="1.0" encoding="UTF-8"?>
<company>
<employee id="1">
<name>Иван Петров</name>
<position>Разработчик</position>
<department>IT</department>
<salary>120000</salary>
</employee>
<employee id="2">
<name>Анна Сидорова</name>
<position>Дизайнер</position>
<department>Маркетинг</department>
<salary>95000</salary>
</employee>
<employee id="3">
<name>Сергей Иванов</name>
<position>Менеджер проектов</position>
<department>IT</department>
<salary>150000</salary>
</employee>
</company>
Шаг 2: Создадим XSLT-таблицу стилей (employees.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>
<head>
<title>Список сотрудников</title>
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
</head>
<body>
<h1>Список сотрудников компании</h1>
<table>
<tr>
<th>ID</th>
<th>Имя</th>
<th>Должность</th>
<th>Отдел</th>
<th>Зарплата</th>
</tr>
<xsl:apply-templates select="company/employee">
<xsl:sort select="department" />
<xsl:sort select="name" />
</xsl:apply-templates>
</table>
<h2>Статистика по отделам</h2>
<ul>
<xsl:for-each select="company/employee[not(department=preceding::employee/department)]">
<xsl:sort select="department" />
<xsl:variable name="dept" select="department" />
<li>
<b><xsl:value-of select="department"/>:</b>
<xsl:value-of select="count(/company/employee[department=$dept])"/> сотрудников
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
<!-- Шаблон для элемента employee -->
<xsl:template match="employee">
<tr>
<td><xsl:value-of select="@id"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="position"/></td>
<td><xsl:value-of select="department"/></td>
<td>
<xsl:choose>
<xsl:when test="salary > 100000">
<span style="color: green"><xsl:value-of select="salary"/> ₽</span>
</xsl:when>
<xsl:otherwise>
<span><xsl:value-of select="salary"/> ₽</span>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Шаг 3: Выполним преобразование. Это можно сделать несколькими способами:
- С помощью браузера (для некоторых браузеров)
- Используя командную строку с утилитами типа
xsltprocилиsaxon - На языках программирования (Python, Java, JavaScript и др.)
Для примера, в командной строке с xsltproc:
xsltproc -o employees.html employees.xsl employees.xml
Рассмотрим ключевые моменты этого преобразования:
- Используем сортировку с
<xsl:sort>для упорядочивания сотрудников сначала по отделам, а потом по имени - Применяем условное форматирование с
<xsl:choose>для выделения зарплат более 100 000 зелёным цветом - Выводим статистику по отделам с помощью
<xsl:for-each>и функцииcount() - Используем
<xsl:variable>для сохранения текущего отдела при подсчёте статистики
Елена Соколова, веб-разработчик На одном из проектов мне пришлось работать с системой, которая генерировала ежедневные отчёты в XML. Клиенту нужно было отображать эти данные на портале в красивом виде, а также иметь возможность экспортировать их в CSV для дальнейшего анализа. Изначально я думала написать парсер на JavaScript, но быстро поняла, что код становится слишком громоздким из-за множества правил отображения. Тогда я вспомнила про XSLT. Я создала две трансформации: одну для преобразования в HTML с интерактивными элементами, другую для генерации CSV. Самым сложным оказалось обработать многоуровневые группировки данных, но XPath с функциями предшествующих и следующих узлов прекрасно справился с задачей. Особенно порадовало, что когда заказчик через полгода запросил изменение в логике группировки, мне потребовалось изменить всего несколько строк в XSLT вместо переписывания всего парсера.
Практические задачи XSLT: от XML к HTML и другим форматам
XSLT — чрезвычайно гибкий инструмент для преобразования XML. Рассмотрим наиболее распространённые практические задачи и способы их решения.
| Преобразование | Типичные задачи | Ключевые элементы XSLT | Сложность |
|---|---|---|---|
| XML → HTML | Отображение данных на веб-страницах, отчёты | Базовые элементы шаблонов | Низкая |
| XML → XML | Изменение структуры, фильтрация, обогащение данных | xsl:copy, xsl:copy-of, условия | Средняя |
| XML → CSV/JSON | Экспорт данных для аналитики, API | Форматирование строк, text output method | Средняя |
| XML → PDF | Печатные формы, документы | XSL-FO (отдельная спецификация) | Высокая |
| XML → SVG | Визуализация данных, графики | Математические вычисления, генерация SVG-синтаксиса | Высокая |
Рассмотрим примеры преобразования XML в различные форматы:
1. Преобразование XML в JSON
XML-данные:
<products>
<product id="1">
<name>Смартфон</name>
<price>25000</price>
<available>true</available>
</product>
<product id="2">
<name>Ноутбук</name>
<price>65000</price>
<available>false</available>
</product>
</products>
XSLT для преобразования в JSON:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
{
"products": [
<xsl:for-each select="products/product">
{
"id": "<xsl:value-of select="@id"/>",
"name": "<xsl:value-of select="name"/>",
"price": <xsl:value-of select="price"/>,
"available": <xsl:value-of select="available"/>
}<xsl:if test="position() != last() ">,</xsl:if>
</xsl:for-each>
]
}
</xsl:template>
</xsl:stylesheet>
2. Преобразование XML в CSV
XSLT для создания CSV-файла из того же XML:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
id,name,price,available
<xsl:for-each select="products/product">
<xsl:value-of select="@id"/>,<xsl:value-of select="name"/>,<xsl:value-of select="price"/>,<xsl:value-of select="available"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
При создании преобразований для различных форматов важно учитывать следующие моменты:
- Метод вывода: используйте соответствующий
<xsl:output method="..." />(xml, html, text) - Экранирование специальных символов: особенно важно для JSON, где кавычки и другие символы требуют экранирования
- Обработка пустых значений: предусмотрите обработку отсутствующих элементов в XML
- Локализация: учитывайте особенности представления дат, чисел и спецсимволов в целевом формате
Для более сложных преобразований (например, XML в PDF) обычно используют промежуточное преобразование XML → XSL-FO → PDF, где XSL-FO (XSL Formatting Objects) — язык описания форматирования для печатных документов. 📄
Инструменты для работы с XSLT: онлайн-сервисы и Python
Для работы с XSLT существует множество инструментов — от онлайн-сервисов до библиотек в различных языках программирования. Рассмотрим наиболее полезные из них.
Онлайн-инструменты для XSLT-преобразований:
- XSLT Test (xslttest.appspot.com) — простой сервис для тестирования XSLT-преобразований
- FreeFormatter (freeformatter.com/xsl-transformer.html) — поддерживает различные версии XSLT
- CodeBeautify (codebeautify.org/xml-to-html-converter) — преобразование XML в HTML с возможностью настройки XSLT
- XSLTFiddle (xsltfiddle.liberty-development.net) — песочница для экспериментов с XSLT
Преимущества онлайн-сервисов в том, что они не требуют установки дополнительного ПО и позволяют быстро проверить работоспособность преобразований. Однако для автоматизации и интеграции в проекты лучше использовать программные библиотеки. 🛠️
Работа с XSLT в Python
Python предлагает несколько библиотек для работы с XSLT. Наиболее популярные — lxml и Saxon-Python.
Пример использования lxml для XSLT-преобразования:
from lxml import etree
# Загрузка XML и XSLT
xml_doc = etree.parse('employees.xml')
xslt_doc = etree.parse('employees.xsl')
# Создание XSLT-трансформатора
transform = etree.XSLT(xslt_doc)
# Применение трансформации
result = transform(xml_doc)
# Сохранение результата
with open('employees.html', 'wb') as f:
f.write(etree.tostring(result, pretty_print=True))
print("Преобразование выполнено успешно!")
Для более сложных задач или поддержки XSLT 2.0/3.0 можно использовать Saxon через его Python-обёртку:
import saxonc
# Создание процессора Saxon
with saxonc.PySaxonProcessor(license=False) as proc:
xslt_proc = proc.new_xslt_processor()
# Загрузка XSLT
xslt_proc.compile_stylesheet(stylesheet_file="employees.xsl")
# Применение трансформации
result = xslt_proc.transform_to_string(source_file="employees.xml")
# Сохранение результата
with open('employees.html', 'w', encoding='utf-8') as f:
f.write(result)
При выборе библиотеки для работы с XSLT в Python стоит учитывать следующие факторы:
- lxml: быстрая, встроенная в большинство дистрибутивов Python, но поддерживает только XSLT 1.0
- Saxon-Python: полная поддержка XSLT 3.0, но требует установки Java и более сложна в настройке
- xml.etree: входит в стандартную библиотеку Python, но не поддерживает XSLT напрямую
Для интеграции XSLT в веб-приложения можно использовать фреймворки, такие как Django или Flask, где преобразование может выполняться как часть обработки HTTP-запросов. Для автоматизации преобразований в промышленных масштабах часто используют Apache Airflow или другие планировщики заданий.
Также стоит упомянуть инструменты для отладки XSLT:
- Oxygen XML Editor — профессиональный редактор с поддержкой отладки XSLT
- XMLSpy — комплексное IDE для работы с XML-технологиями
- VS Code с расширениями — бесплатная альтернатива с плагинами для XML и XSLT
XSLT, несмотря на свой возраст, остаётся одним из самых мощных инструментов для работы с XML. Освоив основные концепции и синтаксис, вы получаете универсальный способ преобразования данных, не привязанный к конкретному языку программирования. Ключевая ценность XSLT — в декларативном подходе: вы фокусируетесь на результате, а не на процессе. Это существенно упрощает поддержку и модификацию преобразований даже спустя годы после их создания. Начните с малого — преобразуйте простой XML в HTML, затем экспериментируйте с более сложными форматами и условиями. XSLT — это навык, который окупается в долгосрочной перспективе, особенно в корпоративной среде, где XML до сих пор широко используется для обмена данными между системами.
Элина Баранова
разработчик Android