Хотя это не точно , что вы хотите, это выражение вернет все узлы между первым и последним классом, но не сгруппирует их вместе. Это лучшее, что вы сможете сделать, используя только одно выражение 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, которое вернуло бы все «первые» tr
с, а затем прошел бы по его братьям и сестрам, пока не нашел бы «последний» tr
. Может быть, кто-то еще знает о лучшем способе сделать это.