XSLT берет дерево ввода и преобразует его в дерево результатов, ваши выражения пути всегда работают с деревом ввода, поэтому любые искомые братья и сестры перемещаются в дереве ввода. С XSLT 2.0 (или с XSLT 1.0 и функцией расширения, такой как exsl: node-set http://www.exslt.org/exsl/index.html), вы можете создавать переменные с временными деревьями, которые затем можно перемещать, например,
<xsl:variable name="rtf1">
<xsl:for-each select="hist:Step">
<xsl:sort data-type="text" select="hist:End" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf1)/hist:Step"/>
будет затем обрабатывать временный набор узлов элементов Step, которые были отсортированы.
С XSLT 2.0 вам не нужен вызов exsl: node-set.