Этот пост посвящен вопросам:
- Кто может делать XSLT на клиенте?
- Какие способы есть для этого?
- Какова полнота реализации XSLT/XPATH современными браузерами?
- Что с поддержкой node-set в частности и EXSLT в общем?
- Какие есть сопутствующие проблемы и как их решать?
С первым вопросом всё просто. По большому счету, XSLT 1.0 сейчас умеют все, кроме мелких мобильных устройств. XSLT 2.0 не умеет никто.
Способов всего существует три:
- Самый универсальный способ – это включить в заголовок xml-файла ссылку на xsl. Например <?xml-stylesheet type="text/xsl" href="/html-page.xslt"?>. Это работает везде, но не всегда. Например не работает в IE при отключенных ActiveX. Также не работает в Opera, если отдаваемый xml имеет формат Atom или RSS.
- Второй способ менее универсален — можно запускать трансформацию из JS. Этот способ имеет очень серьезные ограничения для браузеров на основе WebKit — в этом случае в них не будет работать функция document() и директива xsl:import. Разработчики про эту ошибку знают, но исправлять не спешат.
Ну и про отключенный ActiveX для IE не забываем — XSLT-процессоры от майкрософт реализованы как ActiveX. - И, наконец, буквально на днях узнал третий способ. Сам ещё не проверил. Способ работает только для IE и даже, как утверждается, при отключенном ActiveX!
IE имеет очень интересную технологию внедрения xml-данных в html через тег xml. И кое-кто выяснил, что к этому xml можно подключать и xsl. И даже оформил это дело как плагин для jQuery.
Полнота реализации. В общих чертах – реализовано на 99%. Т.е. работает почти всё, но ошибки портят кайф. Кое-кто частично поддерживает даже EXSLT. Но, чтобы функция node-set заработала в IE, приходится применять хак.
Проблемы. Их реально много, перечислю лишь некоторые:
- Критичен Content-Type для отдаваемых xml- и xsl-файлов. Например Firefox ожидает xsl как text/xml, а не text/xsl.
- IE иногда намертво кэширует xsl-файлы. Помогает только перезапуск браузера.
- IE кэширует Content-Type! Нельзя с одного uri раздавать контент и как html и как xml. Помогает только перезагрузка страницы.
- Индексация контента поисковиками — в данный момент индексация xml-документов в поисковиках работает очень нестабильно. Так что пока выход только один – клоакинг. Звучит страшно, но и гугл и яндекс для данного случая клоакинг неофициально разрешают. Всё работает.
Итог. Применять можно, но только в тех случаях, когда вы уверены, что данный браузер переварит ваш шаблон. Т.е. или фильтруем по User-Agent, или выполняем пробное преобразование и, если оно удачно, далее отдаем xml и xsl.