来自这篇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'))]
没有成功。有什么想法吗?
由于
答案 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
。也许其他人知道更好的方法来做到这一点。