html - 如何在 Enlive 中对更复杂的 HTML 片段使用选择器否定(但是...)?

标签 html css clojure enlive

我有一个 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 ) 来表达这一点,还是我必须自己写一个?

提前致谢

-乔臣

最佳答案

您必须编写自己的选择器:

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

应该可以。

关于html - 如何在 Enlive 中对更复杂的 HTML 片段使用选择器否定(但是...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7017014/

相关文章:

html - 图片 Alt 标签/标题默认左对齐。我怎样才能改变到中心

javascript - object.onclick 不工作

javascript - 启动全屏视频 "onclick"外部按钮

javascript - 在输入类型文本中将小数点右对齐

javascript - 如何为单个图像替换整个 Div 元素(其中包含其他元素)?

css - index.jsp 的 Webservlet urlpatterns

JavaScript:如何使工具提示跟随光标*和*碰撞?

constructor - Clojure:从字符串类名创建新实例

Clojure join 无法根据过滤函数的结果创建字符串

parsing - 如何将 csv 行映射到关键字词典的集合?