Набор узлов не имеет порядка (наборы неупорядочены по определению). Большинство API-интерфейсов XPath представляют результат набора узлов в результате оценки выражения XPath в порядке документов , что вы наблюдаете и сообщаете в своем вопросе.
XPath - это язык запросов (только для чтения), поэтому он никогда не изменяет структуру исходного XML-документа - узлы в наборе узлов выбранных узлов совпадают со своей структурой в исходном XML-документе. В состав, помимо прочего, входит заказ .
Если вам нужно, чтобы узлы возвращались в другом порядке, отличном от их исходного порядка в документе XML, это невозможно сделать только с помощью XPath .
Для этой цели можно использовать XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="library">
<xsl:apply-templates select="*[not(position() >2)]">
<xsl:sort select="position()"
data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML:
<library>
<book name="book1"> hello </book>
<book name="book2"> world </book>
<book name="book3"> !!! </book>
</library>
желаемый, правильный результат:
<book name="book2"> world </book>
<book name="book1"> hello </book>