Clojure, Enlive: как использовать отрицание при использовании многошагового селектора?

Я использую Enlive для Clojure. Я пытаюсь получить теги span с классом "title" внутри тегов li, внутри определенного тега div.

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

Но я хочу исключить теги span внутри тегов li с именем класса "dummy". Код ниже работает как ожидалось:

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

Вопрос в том, как заставить это работать всего одним вызовом. Я не смог использовать отрицание "но" с несколькими шагами и в итоге использовал вложенные вызовы 2 select.

Кто-нибудь может поместить их в одно выражение выбора?

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])
Другие вопросы по тегам