Показаны сообщения с ярлыком шаблоны. Показать все сообщения
Показаны сообщения с ярлыком шаблоны. Показать все сообщения

воскресенье, октября 21, 2007

светлое будущее, наконец, наступило!

помните, с чего началась вся эта эпопея с xml, xsl, xhtml и прочими иксами?

сначала был html, представляющий из себя кашу из данных, оформления и поведения.
потом появились такие технологии как css и javascript, которые позволяли отделить от данных оформление и поведение, но в данных всё-равно оставалось много мусора - семантически незначимых конструкций, а представлять данные требовалось так как их может воспринять браузер - ограничиваясь весьма жёсткими рамками html.

тогда появился xml - формат не накладывающий ограничений на структуру данных. в нём можно использовать свои тэги, вкладывать так как считаешь правильным и многое другое.
естественно, браузеру всё-таки надо было объяснить как эти данные следует отображать. css был недостаточно функционален для отображения произвольных данных, поэтому был разработан xsl, который весьма прохладно был воспринят создателями браузеров. тем не менее, его младшему брату xslt повезло больше: ввиду того, что он не требует переписывать весь браузерный движок, а выступает в качестве посредника, трансформирующего исходный xml в html уже понятный браузеру, его поддержка довольно быстро появилась в ИЕ, мозилле и сафари - основной троице браузерных движков. последней, сравнительно недавно, к ним подключилась и опера (девятая версия).

что мы получили в итоге? получили мы возможность на запрос клиента отдавать только данные в удобной нам форме. если браузер не знает что эти данные означают - он качает xslt и трансформирует их в xhtml. если он не знает как они должны выглядеть - качает css и показывает. если же он не знает как они должны себя вести - качает javascript. xslt, css и javascript качаются один раз и оседают в кэше. при каждом запросе передаётся только экстакт данных в формате xml.

более-менее продвинутый читатель, наверно, уже заметил, что формирование xml ничем принципиально не отличается от формирования html. отчасти это так. если мы формируем документ-ориентированный xml, то придётся вручную вставлять данные в нужные места. но, если наша цель - формирование xml ориентированного на данные, то его формирование можно возложить на автоматику, которая преобразует родные для языка программирования объекты в неродное xml дерево.

чтобы не быть голословным, предлагаю реализацию на php:
function native2xml( $var, $name='root' ){
$xml= '';
if( is_object( $var ) || is_array( $var ) ):
foreach( $var as $n => $v )
$xml.= native2xml( $v, $n );
else:
$xml= htmlspecialchars( $var, ENT_NOQUOTES, 'UTF-8' );
endif;
if( is_numeric( $name ) ) $name= 'item';
return '<'.$name.'>'.$xml.'';
}


просто передайте этой функции дерево объектов и получите на выходе xml-строку.

тут вы можете скачать рабочий пример, демонстрирующий вывод формы и локализацию основанную на xslt (приглядитесь, в xml пересылаются английские фразы, но отображаются они в браузере на русском языке).

из минусов такого подхода:
1. мы ограничиваемся исключительно языком xslt, о недостатках которого я уже писал.
2. для поисковиков и устаревших браузеров нужно производить эти трансформации на сервере.

есть ещё два варианта "объяснения" браузеру как работать с данными:
1. javascript - трансформирование с его помощью - редкостный изврат.
2. OWL - очень мощная технология, но на данный момент никем не поддерживаемая. есть подозрение, что её ждёт та же учесть, что и XSL (-_-)

пятница, октября 19, 2007

YSLT - продолжение идей XSLT

XSLT - самый мощный язык шаблонов, но в нём есть несколько недостатков:
1. нельзя вкладывать шаблоны друг в друга. всё равно, что при программировании пользоваться исключительно глобальными переменными. рано или поздно начинаются конфликты, при большом числе шаблонов сложно отслеживать какой где используется.
2. нельзя использовать xpath для вывода информации в текстовые узлы. точнее можно, но довольно громоздкой конструкцией.

для решения этих и других проблем я надумал сообразить свой темплейтный движок с идеологией схожей с xslt.
наглядный пример можно найти по этой ссылке: http://phpclub.ru/talk/showthread.php?postid=752263#post752263