XSLT - это набор правил для преобразования дерева в другое дерево. Чтобы использовать его эффективно, вы должны думать об этом таким образом.
Некоторые преимущества XSLT для меня:
- Каждый HTML-кодер, на которого я могу положиться, может писать XSLT-преобразования (я могу легко перенести HTML-кодирование на аутсорсинг), но немногие из них могут легко справиться с элементами управления ASP.Net, шаблонами Mako, Django, JSP, Шаблоны Smarty и другие движки одновременно.
- При правильном использовании XSLT самодостаточен. Я могу предоставить кодировщику HTML входной XML, договориться о процессоре XSLT и разработать преобразования XSLT отдельно от самого приложения.
- Среда XSLT находится в «песочнице», HTML-кодер почти не может сам открыть дыру в безопасности.
- XSLT не связан с XML: вы можете написать свой собственный адаптер для доставки данных в XSLT и зарегистрировать свой собственный обработчик вывода. Это не вариант для решений, основанных на libxslt (php, python).
Но это значит, что вы не должны нарушать гибкость. Я видел среды, в которых сложные экземпляры с большим количеством побочных эффектов в поведении передавались саксонскому преобразованию, а входное дерево использовалось только для запуска процесса. Не было никакой возможности разрабатывать отдельно от сложного сервера приложений, и вам пришлось развернуть таблицу стилей в течение 5 минут, чтобы проверить правильность вывода.
UPD : Мои лучшие практики:
Главное, как я уже сказал, это разделить XSLT-преобразование. Для преобразования должно хватить libxslt + exslt, msxsl + собственные расширения и т. Д. Если в XSLT отсутствуют некоторые мощные инструменты, я предпочитаю сделать это в коде вызова и перейти к преобразованию в дереве ввода.
Приложение должно создавать XML (или дерево) предсказуемой (документированной) структуры. Для каждой интересующей меня страницы:
- Я генерирую XML (или пишу его вручную, если его еще не легко получить);
- подготовить полученный HTML-код, который я собираюсь получить в виде отдельного статического файла;
- определить XSLT-преобразование (на нескольких страницах это может быть одно и то же).
Затем я помещаю все в VCS и создаю пакетный файл для применения к каждому XML соответствующего XSL, чтобы в результате перезаписывались статические файлы HTML.
Теперь запуск svn diff html-folder
(или аналогичный) покажет мне, если какое-либо преобразование нарушило HTML, и где именно. Я делаю изменения в XSL и снова запускаю пакет. Как только HTML-код совпадает, я фиксирую.
Каждое изменение в структуре документа XML должно приводить к обновлению соответствующих XML и XSLT, чтобы HTML оставался прежним. Каждое запрошенное изменение в HTML должно приводить к соответствующему изменению в XSLT. HTML-кодировщик может работать изолированно, и я вижу, что что-то пошло не так.
Страницы приложения, где я использую XSLT, обычно принимают параметр GET, такой как showinput = 1, чтобы возвращать пустое дерево ввода без примененного преобразования, чтобы я мог сохранить его и добавить в VCS в качестве другого особого случая.
Что касается кеширования, то когда мне это нужно, я обычно кеширую готовую HTML-страницу. Часто меняющиеся части страниц загружаются клиентскими скриптами.