Это будет зависеть от вашей реализации. Используя xpath 1, выбранный вами путь будет единственным, что будет работать (кроме использования реализации, для которой вы можете писать функции расширения). XPath 1 не может справиться с этим самостоятельно.
Однако мы можем выбрать все соответствующие узлы с помощью
/nodes/*[local-name()='first' or local-name()='second']
или
/nodes/*[self::first or self::second]
или если вы хотите диапазон позиций, мы можем упростить это
/nodes/*[position()<3]
, а затем используйте нашу реализацию для выполнения конкатенации.
Например, с помощью XSLT, я мог бы сделать
<xsl:for-each select="/nodes/*[position()<3]">
<xsl:value-of select="."/>
</xsl:for-each>
или с использованием функции XPath на языке программирования, мы могли бы перебрать результат и сцепить его. Например, с помощью Python и библиотеки LXML (где корень является объектом lxml.etree держа документ), мы могли бы сделать (с помощью селектора на основе позиции)
"".join(root.xpath("/nodes/*[position()<3]/text()"))
Использование XPath 2, это возможно непосредственно
string-join(/nodes/*[position()<3],'')
в самом деле, если нам нужно выбрать по имени, XPath 2 позволяет упростить первое выражение XPATH в списке, и сделать
string-join(/nodes/*[local-name()=('first','second')])
Почему этот вопрос был занижен? Пожалуйста, предоставьте причину, я могу это исправить. –