XPath - получение родителя потомка, соответствующего критериям - PullRequest
0 голосов
/ 01 февраля 2019

Учитывая следующую структуру:

A.узел body с правами root
B. body содержит только узлы span, назовите их spans верхнего уровня
C. spans верхнего уровня содержит комбинации (1) текстовых узлов (2) span с классом, назовите их spans нижнего уровня
D. Нижний диапазон содержит только текстовые узлы

Нам нужно извлечь каждый верхний уровень, который имеет один или несколько нижних уровней с классами "a" или "b".

Наш лучший выстрел еще:

//span//span[contains(concat(' ', normalize-space(@class), ' '), ' qri ') or contains(concat(' ', normalize-space(@class), ' '), ' ktiv ')]

, но он дает более низкие уровни пролета.

Демонстрация:

x = new XPathEvaluator();
var it = x.evaluate("//span//span[contains(concat(' ', normalize-space(@class), ' '), ' a ') or contains(concat(' ', normalize-space(@class), ' '), ' b ')]", document.body.cloneNode(true));
var results = [];
for (var current = it.iterateNext(); current; current = it.iterateNext()) {
  results.push(current.id);
}
console.log(results);
<span id="top1">In a<span id="a1" class="a">ultrices felis</span><span id="b1" class="b">sollicitudin felis</span></span>
<span id="top2">congue velit<span id="a2" class="a">Sed porttitor</span>Phasellus posuere</span>
<span id="top3">purus. Etiam<span id="b2" class="b">tellus, ultrices</span>Morbi interdum</span>
<span id="top4">leo malesuada tristique</span>

Желаемый вывод:

[
    "top1",
    "top2",
    "top3"
]

1 Ответ

0 голосов
/ 01 февраля 2019

Попробуйте следующий XPath

//span[.//span[@class = 'a' or @class='b']]

Он выбирает все span с одним или несколькими span потомками class a или b.

Если вам это нужно еще более конкретно, добавьте parent:: ось

//span[parent::body and .//span[@class = 'a' or @class='b']]

Другая возможность - это абсолютный путь:

/body/span[.//span[@class = 'a' or @class='b']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...