使用带有HTML的XPath 1.0来匹配不在父级中的元素

时间:2014-01-08 17:27:14

标签: html xpath parent

考虑这个HTML:

<div>
  <table>
    <tr>
      <td>
        <a class="cal-date">1</a>
        <div class="checkin-time">6 AM | 8h 30m</div>
      </td>
    </tr>
  </table>
</div>

我想在6 AM | 8h 30m中匹配类(cal-date)和文本内容(1)时使用XPath 1.0返回<a class="cal-date">1</a><a>不是父母或任何东西,所以我有点失落。

这是怎么做到的?

2 个答案:

答案 0 :(得分:1)

XPath具有axes的概念(这是轴的复数,而不是用于砍伐树木的东西)。默认轴是child::轴,因此如果您不指定它,您的查询将搜索上一节点的子节点。您可以使用不同的轴创建更复杂的查询。

在这种情况下,您可能想要使用following-sibling::轴。首先像往常一样选择a元素,然后在查询的下一个位置步骤中指定following-sibling::轴来搜索a节点的兄弟节点而不是其子节点:

//a[@class='cal-date' and . = '1']/following-sibling::div

如果需要,您可以使用div查询更具体,与“普通”XPath一样,并且可以在更改轴后继续查询。例如,如果您的HTML更复杂,看起来像这样:

<a class="cal-date">1</a>
<div>A decoy div</div>
<div>
  <span>Not this</span>
  <span class="checkin-time">6 AM | 8h 30m</span>
  <span> Not this either</span>
</div>

你可以使用像这样的XPath表达式获得checkin-time范围:

//a[@class='cal-date' and . = '1']/following-sibling::div[2]/span[@class='checkin-time']

请注意,在选择span元素后,在following-sibling::div部分之后,未指定轴,因此它使用默认值child::,因为我们正在寻找div

答案 1 :(得分:0)

没有必要使用following-sibling。或者,搜索包含您正在查找的链接的表格单元格所包含的<div/>元素。

//td[a[@class='cal-date' and . = '1']]/div