5

首先,HTML 是一棵节点树。它不仅仅是一个文本。

然而,大多数模板引擎处理它们的输入和输出只是一个文本。他们不在乎他们的标签,他们{$foo}的 's 和<% bar() %>'s 周围发生了什么;他们也不关心他们在输出什么。有时他们碰巧生成了正确的 html,但这只是巧合;他们不是为此而想的,他们想要的只是用他们的评价来替换文本流中的一些有趣的标记。

有一些模板引擎确实将它们的输出视为一组节点。想到了 XSLT 和 Haml。对于某些任务,这具有优势:例如,您可以自动重新格式化(例如,删除所有空文本节点;自动缩进;自动换行)。结果保证是正确的 xml/sgml,除非您使用可以破坏它的严格操作子集。此外,这样的模板引擎会自动引用字符串,在文本节点和属性中有所不同,因为它严格知道您是在编写属性还是文本节点。此外,它可以有条件地从输出中删除一个节点,因为它知道它在哪里开始和结束,这很有用,并且可以执行其他非平凡的节点操作。

您可能不喜欢 XSLT 的冗长性或功能性,但是您的模板是 xmllint-able XML,并且您的输出是一个好的 sgml/xml,这该死的帮助。

所以问题是:您知道哪些模板引擎将其输出视为一组正确的节点,而不仅仅是非结构化文本?我知道 XSLT、Haml 和一些不知名的基于 python 的。呻吟!

4

9 回答 9

2

尽管这些都是嵌入式DSL,但取决于它们的宿主语言

于 2012-02-28T15:09:31.903 回答
2

您知道哪些模板引擎将其输出视为一组正确的节点

令人惊讶的是 ASP.NET 做到了!如果需要,您可以通过一种 DOM 更改页面的 HTML 输出:http ://en.wikipedia.org/wiki/Asp.net#Rendering_technique

于 2009-11-24T08:13:03.343 回答
2

在称为SXML的 Scheme 中有一种表示 XML(或其子集,例如 XHTML)的标准方法。在我看来,这是使 Scheme 成为Web 开发的好语言的原因之一。可以将文档的内容构建为本地方案列表,然后在一个函数调用中将其呈现为(正确的)XHTML。

这是一个示例,它采用一个简单的文本字符串,并将其包装为单段 HTML 页面的内容。因此该函数as-page充当模板;它的输出是一个 Scheme 列表,可以很容易地翻译成它的等效 HTML。这种方法不可能实现不平衡或格式错误的标签。

(use-modules (sxml simple))

(define (as-page txt)
  `(html
    (head (title "A web page"))
    (body (p ,txt))))

(as-page "It works!!!!!")
;; $2 = (html (head (title "A web page")) (body (p "It works!!!!")))

(sxml->xml (as-page "It works!!!!"))
;; $3 = <html><head><title>A web page</title></head><body><p>It works!!!!</p></body></html>
于 2012-04-25T20:27:38.693 回答
1

TAL(最初是 Zope 的一部分,但现在以多种语言实现)是基于 XML 的。使用它是非常合乎逻辑和意图的——而不是塞进一堆文本中,而是告诉模板“将此链接的 href 属性设置为http://google.com/并将其文本内容设置为“搜索 Google”。您不必管理需要转义的字符串 - 通常,如果您打算将某些内容解释为标记,则将其放入模板中,如果您不打算将其解释为标记您将其作为属性值或文本内容输入,TAL 将正确转义它。

于 2009-05-15T20:54:32.527 回答
1

基本上所有使用 XML 作为文件格式的模板引擎(用于定义模板)。通过使用 XML,他们强制文件必须格式正确。

[编辑] 示例是:Genshi (Python) 或JSP 2.0 (Java)。

于 2009-05-15T16:12:16.713 回答
1

使用 Nagare Web 框架, 视图始终是 XML 节点树,直接用 Python 构建。然后可以用 Python 操作树,用 XSL 转换,用 HTML 或 XHTML 序列化......

(“nagare.namespaces”包随 Nagare 项目提供,但可以在任何 Python 应用程序中使用)

例子:

>>> from nagare.namespaces import xhtml_base
>>> h = xhtml_base.Renderer()    # The XHTML tree builder
>>>
>>> # Building the tree of nodes
>>> with h.html:
>>>    with h.body:
>>>        h << h.h1('Hello world')
>>> tree = h.root  # The tree root element
>>>
>>> print tree.write_xmlstring() # Tree serialized in XML

<html><body><h1>Hello world</h1></body></html>
于 2009-05-18T08:23:26.657 回答
1

我在这里维护了一个推式模板系统列表:http: //perlmonks.org/?node_id= 674273

我正在评估各种 Perl 模板系统的分离指数: http ://bit.ly/bXaYt7

但是基于树的一个是我写的,HTML::Seamstress - http://search.cpan.org/dist/HTML-Seamstress/

“推式”一词来自 Terence Parr 的论文“Enforcing Strict Model-View Separation in Template Engines” - http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf

于 2010-02-13T01:33:23.287 回答
0

此外,来自 Haskell 的 snap 的http://snapframework.com/docs/tutorials/heist似乎很合适。

于 2010-05-25T19:38:03.630 回答
0

TAL 绝对不是推式的。它可能是基于 XML 的,但它是拉式(推式的最退化形式)。

于 2010-12-10T18:51:41.327 回答