【问题标题】:Selecting nth element using xpath is returning more results then expected使用 xpath 选择第 n 个元素会返回比预期更多的结果
【发布时间】:2013-07-09 15:12:46
【问题描述】:

我正在使用以下查询:

//*[contains(concat(" ", normalize-space(@class), " "), " sub-category-wrap ")][1]/dl/dt

这应该选择第一个.sub-category-wrap 并返回它的/dl/dt 内容。理想情况下,这将是:

  • Yarn
  • Mice

由于某种原因,它返回:

  • Yarn
  • Mice
  • Fast Tires
  • Fancy Paint

因此,出于某种原因,它从两个.clear-wrap 元素中的dt 中获取内容。我似乎无法从第 n 个.sub-category-wrap 中选择dt

注意: 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>

【问题讨论】:

  • 澄清一下,//*[contains(..)][2]//*[contains(..)][3] 的结果应该是什么?

标签: html xpath


【解决方案1】:

您的查询所做的是检查元素是否是第一个子元素,而不是结果节点集中的第一个。这应该按预期工作:

(//div[contains(concat(" ", normalize-space(@class), " "), " sub-category-wrap ")])[1]/dl/dt

【讨论】:

    【解决方案2】:

    查询//x[1] 表示/descendant-or-self::node()/child::x[1],它选择文档中每个元素的第一个x 子元素。你想要的是(//x)[1],它选择//x选择的序列中的第一个节点。

    【讨论】:

    • 虽然当前接受的答案解决了 OP 遇到的特定问题。这个答案更清楚地解释了潜在的混淆和一般的适当解决方案。
    猜你喜欢
    • 2021-10-03
    • 2021-06-26
    • 2018-07-31
    • 2021-08-01
    • 1970-01-01
    • 2015-05-14
    • 2016-11-13
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多