xPath:选择follow-sibling和self节点

时间:2010-07-13 11:55:30

标签: xpath siblings

来自这篇HTML:

<tbody>
    <tr>
    <tr id="1" class="first">
    <tr id="2" class="">
    <tr id="3" class="last">
    <tr id="4" class="first">
    <tr id="5" class="">
    <tr id="6" class="last">
<tbody>

我试图获取一个xPath表达式来返回所有tr [@ class ='first']节点,然后是tr,它们没有“first”类,包括第一个节点。在这种情况下,一组具有tr id 1,2,3和tr,其中id为4,5,6。

我尝试过使用:

//tbody/tr[@class='first']/self::* | following-sibling::tr[not(starts-with(@class, 'first'))]

没有成功。有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

虽然它不是完全你想要的,但是这个表达式将返回第一个和最后一个类之间的所有节点,但它不会将它们组合在一起。只有一个XPath表达式,这是你能做的最好的。

给出这样的输入,

<tbody>
  <tr id="0" class=""/>
  <tr id="1" class="first"/>
  <tr id="2" class=""/>
  <tr id="3" class="last"/>
  <tr id="4" class="first"/>
  <tr id="5" class=""/>
  <tr id="6" class="last"/>
  <tr id="7" class=""/>
</tbody>

此XPath表达式,

/tbody/tr[
  (following-sibling::tr[@class='last'] and preceding-sibling::tr[@class='first'])
  or @class='first' or @class='last'
]

将返回这些节点:

<tr id="1" class="first" />
<tr id="2" class="" />
<tr id="3" class="last" />
<tr id="4" class="first" />
<tr id="5" class="" />
<tr id="6" class="last" />

该表达式的工作原理是检查所有tr个元素,这些元素的前一个兄弟是'first',其后一个兄弟是'last'。这样,它会将tr排除在那些之外。

但是,它没有进行任何分组。我不知道有任何方法可以使用单个XPath表达式进行这种分组。如果我必须这样做,我会有一个XPath表达式返回所有'第一个'tr s,然后游遍它的兄弟姐妹,直到找到'last'tr。也许其他人知道更好的方法来做到这一点。