Xpath возвращает все непустые текстовые узлы, не являющиеся потомками `a`,` style` или `script`

В каком выражении будут выделены все текстовые узлы, которые:

  • не blank
  • не внутри a, или script или style?

Ответы

Ответ 1

Это должно быть сделано, если предположить, что "не внутри" означает, что текст node не должен быть потомком элемента "a" или "script" или "style". Если "не внутри" означает, что это означает, что это не ребенок, тогда используйте parent:: a и т.д. Вместо предка:: a.

//text()[normalize-space() and not(ancestor::a | ancestor::script | ancestor::style)]

Ответ 2

Использование

//*[not(self::a or self::script or self::style)]/text()[normalize-space()]

Мало того, что это выражение короче, чем в принятом в настоящее время ответе, но оно также может быть намного более эффективным.

Обратите внимание, что выражение вообще не использует никаких осей (назад/вверх).

Ответ 3

Я использовал ответ Димитрия Новачева, но затем я наткнулся на проблему, описанную стартером темы:

не потомок a, style или script

Ответ Dimitre исключает тег style, но включает его дочерние элементы. Эта версия исключает также теги style, script, noscript и их потомки:

//div[@id='???']//*[not(ancestor-or-self::script or ancestor-or-self::noscript or ancestor-or-self::style)]/text()

В любом случае, спасибо Димитрию Новачеву.