5

何よりも、HTMLはノードのツリーです。それは単なるテキストではありません。

ただし、ほとんどのテンプレートエンジンは、単なるテキストであるため、入力と出力を処理します。彼らは彼らのタグ、彼ら{$foo}の'と<% bar() %>'の周りで何が起こるかを気にしません。また、何を出力するかについても気にしません。たまたま正しいhtmlが生成されることもありますが、それは単なる偶然です。彼らはそれを目指していませんでした。彼らが望んでいたのは、テキストストリーム内のいくつかの面白いマークを彼らの評価に置き換えることだけです。

出力をノードのセットとして扱うテンプレートエンジンがいくつかあります。XSLTとHamlが思い浮かびます。一部のタスクでは、これには利点があります。たとえば、自動的に再フォーマットできます(たとえば、すべての空のテキストノードを削除する、自動インデントする、ワードラップする)。それを破ることができる操作の厳密なサブセットを使用しない限り、結果は正しいxml/sgmlであることが保証されます。また、このようなテンプレートエンジンは、属性とテキストノードのどちらを記述しているかを厳密に認識しているため、テキストノードと属性で異なる方法で文字列を自動的に引用します。さらに、ノードがどこで開始および終了するかを知っているため、条件付きでノードを出力から削除できます。これは便利であり、その他の重要なノード操作を実行します。

XSLTの冗長性や機能性は気に入らないかもしれませんが、テンプレートがxmllint可能なXMLであり、出力が優れたsgml/xmlであることは非常に役立ちます。

したがって、問題は次のとおりです。非構造化テキストだけでなく、出力を正しいノードのセットとして扱うテンプレートエンジンを知っていますか?私はXSLT、Haml、そしていくつかのあいまいなpythonベースのものを知っています。うめき声!

4

9 に答える 9

2

出力を正しいノードのセットとして扱うテンプレートエンジンを知っていますか

驚くべきことに、ASP.NETはそうです!必要に応じて、一種のDOMを介してページのHTML出力を変更できます:http://en.wikipedia.org/wiki/Asp.net#Rendering_technique

于 2009-11-24T08:13:03.343 に答える
2

これらはすべて組み込みDSLですが、ホスト言語によって異なります

于 2012-02-28T15:09:31.903 に答える
2

SXMLとして知られているスキームで XML (または XHTML などのそのサブセット) を表す標準的な方法があります。私の意見では、これが、Schemeが Web 開発に適した言語である理由の 1 つです。ドキュメントのコンテンツをネイティブの Scheme リストとして構築し、これを 1 回の関数呼び出しで (正しい) XHTML にレンダリングすることができます。

以下は、単純なテキスト文字列を取り、それを 1 段落の HTML ページのコンテンツとしてラップする例です。したがって、関数as-pageはテンプレートとして機能しています。その出力は、同等の 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

基本的に、XML をファイル形式として (テンプレートを定義するために) 使用するすべてのテンプレート エンジン。XML を使用することで、ファイルが適切な形式である必要があります。

[編集] 例: Genshi (Python) またはJSP 2.0 (Java)。

于 2009-05-15T16:12:16.713 に答える
1

TAL (元は Zope の一部でしたが、現在はさまざまな言語で実装されています) は XML ベースです。これは非常に論理的であり、意図を明確に示します。大量のテキストを押し込む代わりに、「このリンクの href 属性をhttp://google.com/に設定し、そのテキスト コンテンツを'Google を検索'. どの文字列をエスケープする必要があるかを管理する必要はありません - 一般に、何かをマークアップとして解釈するつもりなら、それをテンプレートに入れ、マークアップとして解釈するつもりがないなら、それをテンプレートに入れます。属性値またはテキスト コンテンツとしてフィードすると、TAL はそれを正しくエスケープします。

于 2009-05-15T20:54:32.527 に答える
1

ここでプッシュ スタイルのテンプレート システムのリストを管理しています: http://perlmonks.org/?node_id=674273

また、さまざまな Perl テンプレート システムの分離インデックスを評価中です: http://bit.ly/bXaYt7

しかし、ツリーベースのものは HTML::Seamstress - http://search.cpan.org/dist/HTML-Seamstress/によって書かれています。

「プッシュ スタイル」という用語は、Terence Parr の論文「テンプレート エンジンで厳密なモデル ビュー分離を適用する」に由来します - http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf

于 2010-02-13T01:33:23.287 に答える
1

Nagare Web フレームワークでは、 ビューは常に Python で直接構築された XML ノードのツリーです。その後、ツリーを 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 に答える
0

また、Haskell のスナップのhttp://snapframework.com/docs/tutorials/heistも適しているようです。

于 2010-05-25T19:38:03.630 に答える
0

TAL はプッシュ型ではありません。これは XML ベースかもしれませんが、プル スタイル (プッシュ スタイルの最も縮退した形式) です。

于 2010-12-10T18:51:41.327 に答える