Иногда нельзя избежать более длинного xpath, даже если вы вместо шаблонов используете шаблоны (как следует, если можете). Это особенно верно в XSLT / XPath 2.0:
<xsl:attribute name="tablevel"
select="if (following::*[self::topic | self::part])
then (following::*[self::topic | self::part])[1]/@tablevel
else @tablevel"/>
Я стараюсь не ломать «простой» путь через строки, но ломаю «больший» путь у операторов или условных выражений.
Для редактирования я использую Oxygen (кроссплатформенный), и он довольно хорошо справляется с такими интервалами. Иногда он не может точно предсказать, что вы хотите, но он сохранит пространство, как только он там появится, даже если вы сделаете отступ в коде.