perl XML :: Lib XML не селектор - PullRequest
       24

perl XML :: Lib XML не селектор

2 голосов
/ 05 апреля 2020

В следующем фрагменте HTML:

<div><p class="a b c"></p> <p class="a c"></p> <p class="d"></p> </div>

Я хочу выбрать только второй элемент p (с классом a и без b класс), используя not селектор следующим образом:

p.a:not(.b)

Аналог xpath:

.//p[contains(concat(' ', normalize-space(@class), ' '), ' a ')][not(self::*[contains(concat(' ', normalize-space(@class), ' '), ' b ')])].

Но когда я использую это Выражение xpath, он не может найти элемент.

Есть ли что-то еще, что я могу использовать для достижения эффекта селектора not?

Обновление: кажется, я сделал ошибка, потому что p.a:not(.b) и его коллега xpath, кажется, прекрасно работают для XML::LibXML.

Это не сработало, потому что я ошибся в одном из условий if

1 Ответ

4 голосов
/ 05 апреля 2020

Чтобы получить то, что вы хотите, просто используйте этот XPath:

//p[@class[not(contains(.,"b"))]]

Другими словами: выберите элемент ap с атрибутом @class, который не содержит «b».

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным c (класс должен содержать, но не b):

//p[@class[contains(.,"a")] and not(@class[contains(.,"b")])]
...