XPath-检索符合条件的后代的父级

时间:2019-02-01 12:36:10

标签: xpath

给出以下结构:

A。主体节点作为根
B.主体仅包含跨度节点,称它们为顶级跨度
C.顶级范围包含(1)文本节点(2)具有类的范围的组合,称它们为较低级别的范围
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 :(得分:1)

尝试以下XPath

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

它选择所有span S的有一个或多个span的儿童class ab

如果您需要更具体的信息,请添加一个parent::

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

另一种可能是绝对路径:

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