понедельник, 22 марта 2010 г.

Client-side XSLT

Этот пост посвящен вопросам:

  1. Кто может делать XSLT на клиенте?
  2. Какие способы есть для этого?
  3. Какова полнота реализации XSLT/XPATH современными браузерами?
  4. Что с поддержкой node-set в частности и EXSLT в общем?
  5. Какие есть сопутствующие проблемы и как их решать?

С первым вопросом всё просто. По большому счету, XSLT 1.0 сейчас умеют все, кроме мелких мобильных устройств. XSLT 2.0 не умеет никто.

Способов всего существует три:

  1. Самый универсальный способ – это включить в заголовок xml-файла ссылку на xsl. Например <?xml-stylesheet type="text/xsl" href="/html-page.xslt"?>. Это работает везде, но не всегда. Например не работает в IE при отключенных ActiveX. Также не работает в Opera, если отдаваемый xml имеет формат Atom или RSS.
  2. Второй способ менее универсален — можно запускать трансформацию из JS. Этот способ имеет очень серьезные ограничения для браузеров на основе WebKit — в этом случае в них не будет работать функция document() и директива xsl:import. Разработчики про эту ошибку знают, но исправлять не спешат. 
    Ну и про отключенный ActiveX для IE не забываем — XSLT-процессоры от майкрософт реализованы как ActiveX.
  3. И, наконец, буквально на днях узнал третий способ. Сам ещё не проверил. Способ работает только для IE и даже, как утверждается, при отключенном ActiveX!
    IE имеет очень интересную технологию внедрения xml-данных в html через тег xml. И кое-кто выяснил, что к этому xml можно подключать и xsl. И даже оформил это дело как плагин для jQuery.

Полнота реализации. В общих чертах – реализовано на 99%. Т.е. работает почти всё, но ошибки портят кайф. Кое-кто частично поддерживает даже EXSLT. Но, чтобы функция node-set заработала в IE, приходится применять хак.

Проблемы. Их реально много, перечислю лишь некоторые:

  1. Критичен Content-Type для отдаваемых xml- и xsl-файлов. Например Firefox ожидает xsl как text/xml, а не text/xsl.
  2. IE иногда намертво кэширует xsl-файлы. Помогает только перезапуск браузера.
  3. IE кэширует Content-Type! Нельзя с одного uri раздавать контент и как html и как xml. Помогает только перезагрузка страницы.
  4. Индексация контента поисковиками — в данный момент индексация xml-документов в поисковиках работает очень нестабильно. Так что пока выход только один – клоакинг. Звучит страшно, но и гугл и яндекс для данного случая клоакинг неофициально разрешают. Всё работает.

Итог. Применять можно, но только в тех случаях, когда вы уверены, что данный браузер переварит ваш шаблон. Т.е. или фильтруем по User-Agent, или выполняем пробное преобразование и, если оно удачно, далее отдаем xml и xsl.

1 коммент.:

za_na комментирует...

Здравствуйте, Павел!

Рассматриваете ли вы предложения работы? В компании ИСсофт (issoft.by) открыта вакансия Senior Flash/Flex разработчика на американском проекте. Нам нужен действительно сильный разработчик, готовы предложить интересные условия! Со мной можно связаться в скайпе csi.nataliaz. Спасибо