15

我有一个类似于以下内容的 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)来表达这一点,还是我必须自己写一个?

提前致谢

-约臣

4

3 回答 3

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))]])

应该管用。

于 2011-10-07T11:00:47.663 回答
1
#root #a attrib_2{}
#root #b attrib_2{}
#root #c attrib_2{}
#root #d attrib_2{}
#root #e attrib_2{}

这将选择根 div 内 css 中的所有 attrib2 片段。

于 2011-08-29T00:01:33.740 回答
1

只是为了争论,你不能这样做:

<div id="whatever" class="attrib_2 bar"></div>

从语义上看,这似乎会更好,但是我不知道您正在使用什么系统,或者您的最终目的是什么。但是,如果您要使用类,CSS 将非常简单:

div.attrib.bar {
    something:else;
}
于 2011-10-13T17:42:12.800 回答