2

私は次のhtml構造を持っています:

<div class="top_level">
   ... other elements ...
</div>

そして、出力がDIVのシーケンスになるようにしたい:

<div id="1" class="top_level">
   ... other elements ...
</div>
<div id="2" class="top_level">
   ... other elements ...
</div>
<div id="3" class="top_level">
   ... other elements ...
</div>

ネストされた要素自体がループされる CssSel 変換を介してこれを実行しようとしているため (div 内にテーブルがあります)、次のようなものがあります。

".top_level *" #> groups.map(group =>
  ".top_level [id]" #> group.id & // WHAT CSS Selector can I use? 
  ".the_row *" #> group.rows.map( ... )
  )

IDが設定されないことを除いて、すべて正常に動作します。セレクター「.top_level [id]」がネストされていることがわかります。したがって、機能しないことは理にかなっていますが、探している結果を得るために他に何を配置すればよいか考えられません。

4

2 に答える 2

5

これは、各ノードに id を追加してコンテンツをさらに処理しながら、.top_level 要素を繰り返す方法です。それを切り取り、REPL に貼り付けて、いじることができます。

scala> import net.liftweb.util.Helpers._
import net.liftweb.util.Helpers._

scala> val html = <div class="top_level">
     |   <table>
     |     <tr>
     |       <td>Cell</td>
     |     </tr>
     |   </table>
     | </div>
html: scala.xml.Elem = 
<div class="top_level">
  <table>
    <tr>
      <td>Cell</td>
    </tr>
  </table>
</div>


scala> val data = List(("id1", "cell 1"), ("id2", "cell 2"))
data: List[(java.lang.String, java.lang.String)] = List((id1,cell 1), (id2,cell 2))

scala> val sel = ".top_level" #> {
     |   data map { d =>
     |     ".top_level [id]" #> d._1 &
     |     "td *" #> d._2
     |   }
     | }
sel: net.liftweb.util.CssSel = CssBind(Full(.top_level), Full(ClassSelector(top_level,Empty))) 

scala> sel.apply(html)
res0: scala.xml.NodeSeq = 
NodeSeq(<div class="top_level" id="id1">
  <table>
    <tr>
      <td>cell 1</td>
    </tr>
  </table>
</div>, <div class="top_level" id="id2">
  <table>
    <tr>
      <td>cell 2</td>
    </tr>
  </table>
</div>)
于 2012-12-12T00:48:06.643 に答える
0

もう 1 つの答えは、次のようにコードを再構成することです。

def listXform(itemTemplate : NodeSeq) : NodeSeq = {
  val iterableXform = for(t <- list;
      a <- t.optionalElement;
      b <- a.optionalElement
     ) yield {
     (".top_level [id]" #> a.id &
     // other bits
     ).apply(itemTemplate)
  }

  iterableXform.foldLeft(NodeSeq.Empty)( (a,b) => a ++ b)
}

def render(seq : NodeSeq) : NodeSeq = listXform(seq)

しかし、私の以前の誤解を考えると、これはあまり最適ではありません。

于 2012-12-11T18:04:24.913 に答える