/html/body/*[self::h1 or self::h2 or self::h3]/text()
Недопустимое следующее выражение:
//html/body/*[local-name() = "h1"
or local-name() = "h2"
or local-name() = "h3"]/text()
поскольку он может выбирать текстовые узлы, которые являются дочерними элементами unwanted:h1, different:h2, someWeirdNamespace:h3.
Другая рекомендация: всегда избегайте использования //, когда структура документа XML статически известна. Использование // чаще всего приводит к значительной неэффективности, потому что это приводит к тому, что полное дерево документа (под), связанное в контексте node, проходит.