前面的xpath轴给出了不正确的结果



考虑以下html:

<!DOCTYPE html>
<html>
<body>
<div class="Animal" align="center">
<h2>Animal</h2>
<div class="Vertebrate" align="left" >
<h3 align="left">Vertebrate</h3>
<div class="Fish">
<h4 >Fish</h4>
</div>
<div class="Mammal">
<h4>Mammal</h4>
<div class="Herbivore">
<h5>Herbivore</h5>
</div>
<div class="Carnivore">
<h5>Carnivore</h5>
<div class="Lion">
<h6>Lion</h6>
</div>
<div class="Tiger">
<h6>Tiger</h6>
</div>
</div>
</div>
<div class="Other">
<h4>Other</h4>
</div>
</div>
<div class="Invertebrate">
<h3>Invertebrate</h3>
<div class="Insect">
<h4>Insect</h4>
</div>
<div class="Crustacean">
<h4>Crustacean</h4>
</div>
</div>
</div>
</body>
</html>

之间的区别是什么

//div[@class='Mammal']//preceding::div

//div[@class='Mammal']/preceding::div

请注意第一行中xpath中的双斜杠和第二行中的

单斜杠CCD_ 1给出一个结果,而CCD_ 2在chrome版本86中给出5个结果。

在我看来

//div[@class='Mammal']//preceding::div应给出3个结果:

<div class="Animal">
<div class="Vertebrate">
<div class="Fish">

为什么它不这么做?

感谢

这两个表达式之间的区别:

表达式1

//div[@class='Mammal']/preceding::div

选择从CCD_ 5直接看到的任何先前的CCD_。

因为元素必须关闭才能被视为prededing,所以在示例HTML中唯一正确的<div>

<div class="Fish">

表达式2

//div[@class='Mammal']//preceding::div

选择从CCD_ 9的任何后代看到的任何先前的CCD_。

在您的示例HTML中,这适用于

<div class="Fish">
<div class="Herbivore">
<div class="Carnivore">
<div class="Lion">
<div class="Tiger">

//div[@class='Mammal']//preceding::div0位于Mammal的文本节点子代之前,因此它是结果的一部分。

您的期望

应该给出3个结果:

<div class="Animal">
<div class="Vertebrate">
<div class="Fish">

表达式1满足其中一个。另外两个是ancestor,而不是preceding

因此,这将起作用(在XPath1.0中(:

//div[@class='Mammal']/preceding::div|//div[@class='Mammal']/ancestor::div

或更短(在XPath 2.0中(

//div[@class='Mammal']/(preceding::div|ancestor::div)

您期望得到这个结果

<div class="Animal">
<div class="Vertebrate">
<div class="Fish">

是不正确的,因为只有class="Fish"在节点之前,而另外两个是祖先。如果你想得到这个结果,试试

//div[following::div[@class='Mammal'] or descendant::div[@class='Mammal']]

相关内容

  • 没有找到相关文章