XSLT: плюшки и грабли

Уже более трёх лет я являюсь разработчиком CMS, использующей XSLT в качестве шаблонизатора.

XSLT — это мощная технология, и существует она довольно давно. Её польза для трансформции одного XML документа в другой очевидна. Однако, использование XSLT в качестве шаблонизатора CMS оказалось спорным вопросом: есть и против, и за.

Ниже я изложил своё мнение того, где в XSLT грабли, а где плюшки.

Разделение данных и представления

Википедия говорит нам: "Одной из задач, решаемых языком XSLT, является отделение данных от их представления". По сути, задача практически всех шаблонизаторов CMS — это отделение данных от представления. В чём же преимущество XSLT?

Данные для XSLT-преобразования — это XML-документ, структурированное дерево объектов. XML очень распространённый формат, для него есть широкий набор инструментов.

В XSLT активно используется язык XPath — одно из лучших средств для выполнения запросов к дереву объектов.

В отличии от многих других шаблонизаторов, в XSLT практикуется декларативный подход. Преобразование (xsl:stylesheet) может состоять из нескольких шаблонов (xsl:template), каждый из которых определяет представление для некоторого подмножества данных. Разделение одного преобразования на изолированные шаблоны делает код более понятным и сопровождаемым, а также дает возможность повторного использования шаблонов.

В шаблонизаторах вроде Apache Velocity часто с первого взгляда становится понятно, каким будет результат. В XSLT множество шаблонов и правила их применения приводят к тому, что результат всего преобразования становится не столь очевиден. Однако никто не мешает применить привычный подход: создать один шаблон и использовать xsl:choose и xsl:for-each внутри.

XSLT - позволяет решить одну и ту же задачу разными способами. Именно эта свобода выбора позволяет принимать неправильные решения, приводящие к сложным шаблонам с нетривиальной логикой. Более подробно тонкости использования XSLT я разобрал в своей статье "Практика XSLT".

Входные данные XSLT-преобразования

Перед разработкой шаблона любого шаблонизатора frontend-разработчик должен узнать, какими данными он располагает и каков их формат этих данных. Для шаблонизаторов вроде Velocity в таких случаях нужно смотреть исходный код модуля или читать документацию. Для XSLT преобразования главным входным параметром является XML-документ, который легко получить, использовав преобразование XML-документа в самого себя.

Кроме входного документа в XSLT-преобразование можно передавать дополнительные параметры.

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

XSLT-процессоры часто поддерживают расширение функциональности XSLT за счёт подключения функций сторонних библиотек. Это очень полезно, когда вашему шаблону не хватает данных исходного XML-документа, либо данные нуждаются в сложном форматировании. Например, в Umbraco CMS перевести дату в необходимый формат можно с помощью функции из umbraco.library. А XSLT-процессор MSXSL позволяет встраивать C#-код внутрь XSLT-шаблонов (пример).

Процесс разработки с использованием XML/XSLT

Если данные отделены от представления с помощью XML/XSLT, команде разработчиков легче выполнять свои задачи параллельно. Рассмотрим пример создания новостного модуля новостей к CMS. Общая схема работы: модуль генерирует XML, а CMS применяет к нему соответствующее XSLT-преобразование.

Когда требования к модулю определены, составляется несколько примеров XML-документов, которые будет генерироваться модулем. Эти макеты принимаются, как спецификация. Разработчики серверной части начинают разработку бизнес-логики. В это время разработчики клиентской части начинают создание XSLT-преобразования, генерирующие HTML и RSS, на базе XML-документов спецификации. При таком подходе недостатки спецификации XML-документов (лишние данные, недостаток данных, неверный формат данных), будут найдены раньше, и возможно даже раньше чем бизнес-логика получения этих данных будет реализована. Кроме того, модуль, который выводит XML, проще тестировать.

Место XSLT в жизни

XSLT — это мощный инструмент, который имеет свои сильные стороны, и подводные камни. Его применение всегда и везде не вполне оправдано. Если нужно сделать простой шаблон для письма, который мог бы изменить простой редактор сайта, то использование XSLT по меньшей мере жестоко. С другой стороны шаблоны современных сайтов сложны и создаются разработчиками Web-студий "под ключ". Заказчику проще заплатить той же студии за доработку, чем пытаться редактировать шаблоны самому. Разработчикам же приятно иметь хорошую документацию, удобный редактор и отладчик, средства расширения. Поэтому я считаю, что использование XSLT web-студиями хорошо и полезно.