Указанное вами XPath-выражение:
//p[not(ancestor::*[3])]
//table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]
tr/td//a
синтаксически недопустимо - отсутствует /
перед tr
.
Исправленный XPathвыражение :
//p[not(ancestor::*[3])]
//table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]
/tr/td//a
было предоставлено в качестве ответа на этот вопрос .
Как объяснено в связанном (выше) ответе,значение:
Это выбирает все элементы, чей родитель или прародитель - td, чей родитель - tr, чей родитель - таблица, чей родитель или дед - p
, который имеетменее 3 ancesstor - элементов
ОП хотел получить способ * получить элементы a
, которые могут быть расположены под p
скрытыми не ниже 3 уровней под корнем документа, а затемпод table/tr/td
, где table
похоронен на уровне не более 3 от p
.
Конечно, желание выбирать такие узлы может показаться не слишком значимым , но мы не в состоянии судить о чьих-либо потребностях и требованиях.
АмаФактом является то, что XPath настолько мощен, чтобы удовлетворить даже такие требования.