首先,HTML 是一棵节点树。它不仅仅是一个文本。
然而,大多数模板引擎处理它们的输入和输出只是一个文本。他们不在乎他们的标签,他们{$foo}
的 's 和<% bar() %>
's 周围发生了什么;他们也不关心他们在输出什么。有时他们碰巧生成了正确的 html,但这只是巧合;他们不是为此而想的,他们想要的只是用他们的评价来替换文本流中的一些有趣的标记。
有一些模板引擎确实将它们的输出视为一组节点。想到了 XSLT 和 Haml。对于某些任务,这具有优势:例如,您可以自动重新格式化(例如,删除所有空文本节点;自动缩进;自动换行)。结果保证是正确的 xml/sgml,除非您使用可以破坏它的严格操作子集。此外,这样的模板引擎会自动引用字符串,在文本节点和属性中有所不同,因为它严格知道您是在编写属性还是文本节点。此外,它可以有条件地从输出中删除一个节点,因为它知道它在哪里开始和结束,这很有用,并且可以执行其他非平凡的节点操作。
您可能不喜欢 XSLT 的冗长性或功能性,但是您的模板是 xmllint-able XML,并且您的输出是一个好的 sgml/xml,这该死的帮助。
所以问题是:您知道哪些模板引擎将其输出视为一组正确的节点,而不仅仅是非结构化文本?我知道 XSLT、Haml 和一些不知名的基于 python 的。呻吟!