2

从这段 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 没有“第一”类,包括第一个节点。在这种情况下,一组 tr 的 id 为 1、2、3 和 tr 的 id 为 4、5、6。

我试过使用:

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

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

谢谢

4

1 回答 1

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其前面的兄弟是“第一个”并且其后面的兄弟是“最后一个”的所有元素来工作。这样,它将排除tr那些之外的 s 。

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

于 2010-07-13T12:19:20.857 回答