Pull to refresh

xslt-преобразование на стороне клиента.

Reading time 2 min
Views 986
Я приверженец xml. Мне очень нравится подход к проектированию вэб-приложений при котором бизнесс-логика отделена от представления посредствам xml/xslt. Я не сторонник изобретения велосипедов (шаблонизаторов типа Smarty), и вообще, прикручивания рогов и педалей к лопате.

На днях задался целью выяснить каких успехов достигли разработчики браузеров на ниве client side xslt-преобразования. Потому как выполнять преобразование на сервере не интересно — жрутся рессурсы, расходуется канал (что особо важно для пользователей слабеньких каналов и мощных компьютеров). Да и вообще, преобразование на стороне клиента на мой взгляд просто правильнее. Задача отображения документа — есть задача браузера. Вот пусть он этим и занимается.

За эталон правильности выполнения преобразования был взят результат работы программы xsltproc.

Вот что я получил:

Почему-то при указании метода xsl:output method=«xml» ни Opera, ни Firefox упорно не хотят выполнять преобразование. Точнее они его как-то навеное выполняют, но не правильно отображают — на экран вываливается просто тест без всякого форматирования.
В случае указания xsl:output method=«html» (по умолчанию), то преобразование выполняется, но вывод программы xsltproc становится чисто html-ым — <br>,<hr>,nowrap. Не знаю, как посмотреть результат преобразования Оперного и Фаерфоксовского движка. (может у них всё и здорово...) Отображается все и в том и другом браузере корректно, что обнадёживает.

JavaScript и xslt.



Тут оказалось всё несколько интересно. У меня на сайте размещено некоторое колличество баннеров всем известных баннерных сетей а также пара кнопок и счётчиков. Код показа баннеров представляет из себя банальный document.write('<a href=«some.site»><img src=«path/to/banner»></a>'); (Да, тэг <img> конечно не имеет /> — люди деньги зарабатывают, им некогда блюсти стандарты. :) ). Я вынес всю эту чушь в отдельные .js файлы и где нужно было просто делал вставочки <script src=«banner1.js»></script>. xsltproc перегонял такую верстку в валидный xhtml/strict. Opera такой код просто игнорировала. Firefox сначала спотыкался при попытке обработки первого баннера, затем просто падал — document.write просто перезаписывал всю DOM-модель и соответственно на экран выводился только первый баннер. При попытке повторной перезаписи DOM-модели у фаерфокса видимо просто отстреливало башню.

В итоге я переписал код показа баннеров на нормальный, через DOM-модель и всё стало отображаться нормально.

P.S.



Через некоторое время после постановки этих эксперементов узнал, что есть оказывается XSL 2.0, в который добавлен xsl:output method=«xhtml». (Этот метод вывода понимает пока только Опера. Результат работы ничем не отличается от method=«html». Хотя может быть я просто на слишком простом примере тестировал. Firefox не понимает его вообще.) Забавно, но этот стандарт ещё практически не реализован ни в каком виде. Есть имплементация на java. Но gnom'овски libxml/libxslt (которые использует PHP-интерпретатор) ещё не подтянулись.
Tags:
Hubs:
0
Comments 3
Comments Comments 3

Articles