我正在使用以下查询:
//*[contains(concat(" ", normalize-space(@class), " "), " sub-category-wrap ")][1]/dl/dt
这应该选择第一个.sub-category-wrap
并返回它的/dl/dt
内容。理想情况下,这将是:
Yarn
Mice
由于某种原因,它返回:
Yarn
Mice
Fast Tires
Fancy Paint
因此,出于某种原因,它会抓取dt
元素中.clear-wrap
的内容。我似乎无法从第n个dt
中选择.sub-category-wrap
。
注意: xpath查询中的[1]
选择器实际上是我代码中的一个变量,因此请谨慎对待您提供的解决方案。
<div class="clear-wrap">
<div class="sub-category-wrap">
<h3>Cats</h3>
<dl>
<dt>Yarn</dt>
<dd><!-- Content --> </dd>
<dt>Mice</dt>
<dd><!-- Content --></dd>
</dl>
</div>
<div class="sub-category-wrap">
<h3>Dogs</h3>
<dl>
<dt>Kibbles</dt>
<dd><!-- Content --> </dd>
<dt>Drool</dt>
<dd><!-- Content --></dd>
</dl>
</div>
</div>
<div class="clear-wrap">
<div class="sub-category-wrap">
<h3>Cars</h3>
<dl>
<dt>Fast Tires</dt>
<dd><!-- Content --> </dd>
<dt>Fancy Paint</dt>
<dd><!-- Content --></dd>
</dl>
</div>
<div class="sub-category-wrap">
<h3>Trucks</h3>
<dl>
<dt>Mud Tires</dt>
<dd><!-- Content --> </dd>
<dt>Loud Pipes</dt>
<dd><!-- Content --></dd>
</dl>
</div>
</div>
答案 0 :(得分:2)
您的查询正在检查该元素是否为第一个子元素,而不是它是结果节点集的第一个元素。这应该按预期工作:
(//div[contains(concat(" ", normalize-space(@class), " "), " sub-category-wrap ")])[1]/dl/dt
答案 1 :(得分:2)
查询//x[1]
表示/descendant-or-self::node()/child::x[1]
,它选择文档中每个元素的第一个x子元素。你想要的是(//x)[1]
,它选择//x
所选序列中的第一个节点。