Хорошо, с XPath 2.0 и XQuery 1.0 есть операторы <<
и >>
, которые полезны для выражения таких условий, как, например, у вас. с XQuery вы можете красиво написать
let $tr := <tr>
<td colspan="4">Foo || Bar</td>
<td rowspan="4">TEXT1</td>
<td valign="top">TEXT2</td>
<td valign="top">TEXT3</td>
.....
<td colspan="4">VARIABLE</td>
</tr>
let $td1 := $tr/td[contains(., 'Foo') or contains(., 'Bar')][1]
let $td2 := $td1/following-sibling::td[@colspan = 4][1]
return $tr/td[. >> $td1 and . << $td2]
чтобы найти 'td
элементы "между" этими двумя другими td
элементами.
Очевидно, что в XPath 2.0 у вас нет функции let и return, поэтому вам нужно будет попытаться объединить все в одно выражение:
$tr/td[. >> $tr/td[contains(., 'Foo') or contains(., 'Bar')][1] and . << $tr/td[contains(., 'Foo') or contains(., 'Bar')][1]/following-sibling::td[@colspan = 4][1]]
, где $tr
- это узел контекста.