Clojure,Enlive:如何在为选择器使用多步时使用否定?

时间:2017-04-24 12:32:45

标签: clojure selector negation enlive

我正在使用Enlive进行Clojure。我正在尝试在特定div标签内的li标签内获取带有“title”类的span标签。

<div class="main">
    <li><span class="title">wanted</span></li>
    <li><span class="title">wanted</span></li>
    <li class="dummy"><span class="title">NOT wanted</span></li>
</div>

但是,我想在li标签中排除具有类名“dummy”的span标签。下面的代码按预期工作:

(html/select (html/select src [:div.main]) [[:li (html/but 
:li.dummy)] :span.title])

问题是如何通过一次选择调用来完成这项工作。我无法通过多个步骤使用“但是”否定,最终使用嵌套的2个选择调用。

任何人都可以把它们放在一个单一的选择表达式中吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是你提出的选择器是正确的。

它不匹配的原因是您的HTML格式不正确 - 请记住默认的TagSoup解析器会尝试清理您的输入。在您的片段中,您有列表上下文之外的列表项,因此TagSoup会提前关闭包装<div>

您必须将列表项包装在列表中,例如<ol>

<div class="main">
    <ol>
        <li><span class="title">wanted</span></li>
        <li><span class="title">wanted</span></li>
        <li class="dummy"><span class="title">NOT wanted</span></li>
    </ol>
</div>

然后以下选择器应该这样做:

(html/select src [:div.main [:li (html/but :.dummy)] :span.title])