使用xpath选择第n个元素会返回比预期更多的结果

时间:2013-07-09 00:41:39

标签: html xpath

我正在使用以下查询:

//*[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>

2 个答案:

答案 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所选序列中的第一个节点。