我有一个类似于:
的HTML代码段<div id="root">
<div id="A" attrib_2="bar"></div>
<div id="B" attrib_2="baz">
<div id="H" attrib_1="gnu">
<p>
<div id="F" attrib_2="baz"></div>
</p>
</div>
</div>
<div id="C" attrib_2="owl"></div>
<div id="D" attrib_2="uhu"></div>
<div id="E" attrib_2="boom"></div>
</div>
现在,我想选择所有具有attrib_2(* [attrb_2])的片段,不包括具有attrib_1设置的节点的后代。使用任意标记可以有更多嵌套级别(在此示例中为<p>
)。有了Enlive(http://enlive.cgrand.net/),我已经尝试了类似的东西:
(select snippet [(but (attr? :attrib_1)) (attr? :attrib_2)])
但这不起作用,因为否定(but (attr? :attrib_1))
也匹配<p>
标记。有没有办法用给定的选择器谓词(http://enlive.cgrand.net/syntax.html)表达这个,或者我是否必须自己写一个?
提前致谢
-Jochen
答案 0 :(得分:4)
您必须编写自己的选择器:
(def parents
(zip-pred (fn [loc pred]
(some pred (take-while identity (iterate zip/up loc))))))
(未测试的)
然后
(select snippet [[(attr? :attrib_2) (but (parents (attr? :attrib_1))]])
应该有用。
答案 1 :(得分:1)
#root #a attrib_2{}
#root #b attrib_2{}
#root #c attrib_2{}
#root #d attrib_2{}
#root #e attrib_2{}
将在根div中选择css中的所有attrib2片段。
答案 2 :(得分:1)
为了争论,你不能这样做:
<div id="whatever" class="attrib_2 bar"></div>
从语义上看,这似乎会更好,但我又不知道你正在使用什么系统,或者你的最终目的是什么。但是,如果你要使用类,那么CSS将非常简单:
div.attrib.bar {
something:else;
}