Вы можете избежать повторения с помощью атрибута test вместо:
a/b/*[local-name()='c' or local-name()='d' or local-name()='e']
Вопреки антагонистическому мнению Димитра, вышеприведенное не является неправильным в вакууме, когда OP не определил взаимодействие с пространствами имен. Ось self::
ограничивает пространство имен, local-name()
- нет. Если OP намерен захватить c|d|e
независимо от пространства имен (что я бы даже предположил, это вероятный сценарий, учитывая природу проблемы ИЛИ), то это «другой ответ, у которого все еще есть положительные голоса», что неверно.
Вы не можете быть окончательным без определения, хотя я очень рад исключить мой ответ как действительно неправильный, если ОП разъясняет его вопрос так, что я ошибаюсь.