Вообще lloyd наталкивает на интересные мысли. Условный
макропроцессор можно сделать комбинировав пункты 1 и 2. Т.е. мы
пишем шаблон в html как есть, но в нём вставляются специальные
элементы или атрибуты. Потом шаблон трансформируется и вставляется
в страницу. В процессе трансформации для специальных элементов или
атрибутов вызываются функции, которые осуществляют подстановку
данных (каких -- указано в атрибутах или тексте элементов). Для
элементов -- они подменяются на результат вывода функции. При этом внутреннее содержимое спец. элемента передаётся как аргумент функции (и тоже может быть шаблоном, так можно сделать таблицы). Для атрибутов -- спец. атрибут позволяет заменить атрибут того элемента которому он принадлежит (для заполнения input'ов). Спец. элементы или атрибуты содержат имена функций которые должны быть определены во внутреннем scope шаблонизатора, и которые осуществляют подстановку каждого конкретного значения. Функции могут доставать данные из XML через XPath, данные из Json и т.п. Решение не schema-based, потому, что наличие определенных функций подразумевается уже в шаблоне.