Parser szablonów

Wczoraj, bądź przedwczoraj wpadłem na pomysł wykorzystania DOM XML i XSL przy tworzeniu szablonów. Zainspirował mnie PHP TAL (Template Attribute Language).

Z początku szablon miał być stylem XSL, jednak pomysł ten szybko odpadł ze względu na to, że uniemożliwia to tworzenie własnych komponentów, a przynajmniej ja nie wiem jak to zrobić. W tym układzie w pamięci przechowywany byłby obiekt DomDocument z odpowiednią struktórą - odwzorowaniem dodanych zmiennych. Drugi pomysł wyklucza użycie XSL. Szablon jest parsowany DOM XMLem a następnie rekurencyjnie przeglądany. Na podstawie nazw tagów i zarejestrowanych na początku szablonu rozszeżeń parser tworzy odpowiednie obiekty odpowiadające za komponenty. Ogólnie idea tworzenia własnych rozszeżeń jest rodem z JSP. Nie wiem co z tego wyjdzie i wogóle czy coś z tego będzie.. ;)

Jedno jest pewne - odpada problem z gromadą wyrażeń regularnych, pozbywam się kompilatora. Zostaje parser i być może cache. Sam jestem ciekaw czy to rozwiązanie będzie szybsze niż np. Smarty. Poniżej bardzo abstrakcyjne przykłady.

<?xml version="1.0" ?>
<x xmlns:i18n="http://template.splatch.pl/i18n"
    xmlns:pst="http://template.splatch.pl/pst"
    xmlns:attr="http://template.splatch.pl/attr"
    xmlns="http://template.splatch.pl/" >
    <i18n:message select="Hello">
        <pst:test equals="true" assigned:variable="AssignedVar" assigned:value="OtherVar">
            Test 1
        </pst:test>
        <pst:test identical="true" assigned:variable="AssignedVar" value="TestVar">
            Test 2
        </pst:test>
    </i18n:message>
</x>
<?php

$tpl = new PST;
$i18 = ConfigParserFactory::get('i18n-test/pl.ini');
$tpl->setI18nDatasource($i18); // ConfigParser

$tpl->assign('AssignedVar',true);
$tpl->assign('OtherVar',false);

$tpl->display('test.xml');

?>