Enlive:在没有父元素的模板中附加一个片段?

时间:2014-08-08 00:14:21

标签: clojure enlive

假设我只能访问<article>文件中的/public/articles.html和子元素。

   ...
   <article class="clj-article">
        <h1 class="clj-title"></h1>
        <p class="clj-date"></p>
        <ul>
            <li class="clj-tag"></li>
        </ul>
    </article>
    ...

如何在不知道父元素的情况下迭代<article>? (defsnippet)中有deftemplate

(def articles [{:title "title1"
                :date "date1"
                :tags ["tag1" "other tag1"]}
               {:title "title2"
                :date "date2"
                :tags ["tag2" "other tag2"]}])

(e/defsnippet show-articles "public/articles.html" [:.clj-article] [articles]
  [:.clj-article]
    (e/clone-for [a articles]
      [:.clj-title]
        (e/content (:title a))
      [:.clj-date]
        (e/content (:date a))
      [:.clj-tag]
        (e/clone-for [t (:tags a)]
          [:.clj-tag] (e/content t))))

我的代码段提供了我需要的输出,然后我想将它插入我的模板(以及articles.html其他部分中的其他代码段)因为我不了解.clj-article父母我试图将其作为目标:

(e/deftemplate index "public/articles.html" []
  [:.clj-article]
       (e/append (show-articles articles)))

我得到了我想要的输出,但包含在其他<article>和子模式中。

<article class="clj-article">
    <h1 class="clj-title"></h1>
    <p class="clj-date"></p>
    <ul class="clj-tags">
        <li class="clj-tag"></li>
    </ul>
    <article class="clj-article">
        <h1 class="clj-title">title1</h1>
        <p class="clj-date">date1</p>
        <ul class="clj-tags">
            <li class="clj-tag">tag1</li>
            <li class="clj-tag">other tag1</li>
        </ul>
    </article>
    <article class="clj-article">  <h1 class="clj-title">title2</h1>
        <p class="clj-date">date2</p>
        <ul class="clj-tags">
            <li class="clj-tag">tag2</li>
            <li class="clj-tag">other tag2</li>
        </ul>
    </article>
</article>

如何防止这种情况发生?

谢谢!

1 个答案:

答案 0 :(得分:0)

Christophe Grand在他精彩的教程中得到了答案! https://github.com/cgrand/enlive/wiki/Table-and-Layout-Tutorial,-Part-3:-Simple-Transformations#whole-tag-transformations

使用e/substitute

覆盖实际元素,而不是将代码段添加到父元素之前。
(e/deftemplate index "public/articles.html" []
  [:.clj-article]
       (e/substitute (show-articles articles)))