考虑以下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::div
0位于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']]