Это будет работать для вас
//text[starts-with(.,"*")]/preceding-sibling::text
| //text[starts-with(.,"*")]/following-sibling::text[position() > 4]
Для предоставленного ввода это возвращает желаемые узлы
<text attr="123" attr2="1234">ROW 1 CELL 1</text>
<text attr="123" attr2="1234">ROW 1 CELL 2</text>
<text attr="123" attr2="1234">ROW 1 CELL 3</text>
<text attr="123" attr2="1234">ROW 1 CELL 4</text>
<text attr="123" attr2="1234">ROW 1 CELL 5</text>
<text attr="123" attr2="1234">ROW 3 CELL 1</text>
<text attr="123" attr2="1234">ROW 3 CELL 2</text>
<text attr="123" attr2="1234">ROW 3 CELL 3</text>
<text attr="123" attr2="1234">ROW 3 CELL 4</text>
<text attr="123" attr2="1234">ROW 3 CELL 5</text>
Однако, как указывает @lwburk в комментариях, это не работает для общегослучай, если у вас есть несколько узлов, которые начинаются с *.Это связано с тем, что оператор |
в паре с двумя операторами завершает выбор всего до и после обоих соответствующих узлов.Его решение правильно обрабатывает обе ситуации.