defsnippet は、html の特定の部分にのみ一致し (これがセレクターを引数として取る理由です)、それを変換します。deftemplate は、html 全体を取得して変換します。また、defsnippet は Clojure データ構造を返しますが、deftemplates は文字列のベクトルを返します。そのため、defsnippet は通常、deftemplate 内で使用されます。
スニペット (またはセレクター) によって返されるデータがどのようなものかを理解するには、次のようにします。
(enlive/html-snippet "<div id='foo'><p>Hello there</p></div>")
;=({:tag :div, :attrs {:id "foo"}, :content ({:tag :p, :attrs nil, :content ("Hello there")})})
あなたの場合、次のようなものが必要です:
header.html:
<div id="my-header-root">
...
</div>
Clojure コード:
(enlive/defsnippet header "path/to/header.html" [:#my-header-root] []
identity)
(enlive/defsnippet footer "path/to/footer.html" [enlive/root] []
identity)
(enlive/deftemplate layout "layout.html" [header footer]
[:head] (enlive/content header)
[:body] (enlive/append footer))
(defroutes home-routes
(GET "/" [] (layout (header) (footer))
スニペットで使用される ID 関数は、その引数を返します。この場合、:#my-header-root セレクターによって選択されたデータ構造です (変換は行いません)。head.html にすべてを含めたい場合は、enlive に付属のルート セレクター ステップを使用できます。
次のようなものを使用して、defsnippet から生成された html を表示できます。
(print (apply str (enlive/emit* (my-snippet))))
また、 https ://github.com/swannodette/enlive-tutorial/ のチュートリアル
と、defsnippet マクロと deftemplate マクロがどのように機能するかについての詳細については、Brian Marick によるチュートリアルもお勧めします。
最後のヒントとして、enlive に付属の sniptest マクロを使用して、セレクターと変換を試すことができます。
(enlive/sniptest "<p>Replace me</p>"
[:p] (enlive/content "Hello world!"))
;= "<p>Hello world!</p>"