Я бы пошел с чем-то вроде этого:
//fo:block[@id='text' and not(./*[@id='text'])]
Я собираюсь дать ему тест прямо сейчас, чтобы убедиться, что он нормальный. Да уж. Возвращает text00 и text03, как требуется. Итак, позвольте мне объяснить это выражение.
//fo:block # Select all fo:block elements in the document
[
@id='text' and # Get only those whose id attribute's value is "text"
not(./*[@id='text']) # and whose children do not have id attributes equal to "text"
]