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