[Заменил мой последний ответ. Теперь я лучше понимаю, что вам нужно.]
Вот решение XSLT 2.0:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<xsl:variable name="elements-after" select="t|u|v|w|x|y|z"/>
<xsl:copy>
<xsl:copy-of select="* except $elements-after"/>
<s>new node</s>
<xsl:copy-of select="$elements-after"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Вы должны явно перечислить элементы, которые идут после, или элементы, которые идут раньше. (Вам не нужно перечислять оба.) Я бы предпочел выбрать более короткий из двух списков (следовательно, «t» - «z» в приведенном выше примере вместо «a» - «r»).
ОПЦИОНАЛЬНОЕ УЛУЧШЕНИЕ:
Это выполнит работу, но теперь вам нужно вести список имен элементов в двух разных местах (в XSLT и в схеме). Если это сильно изменится, то они могут выйти из синхронизации. Если вы добавите новый элемент в схему, но забудете добавить его в XSLT, он не будет скопирован. Если вы беспокоитесь об этом, вы можете реализовать свой собственный вид понимания схемы. Допустим, ваша схема выглядит следующим образом:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="a" type="xs:string"/>
<xs:element name="r" type="xs:string"/>
<xs:element name="s" type="xs:string"/>
<xs:element name="t" type="xs:string"/>
<xs:element name="z" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Теперь все, что вам нужно сделать, это изменить определение переменной $ elements-after:
<xsl:variable name="elements-after" as="element()*">
<xsl:variable name="root-decl" select="document('root.xsd')/*/xs:element[@name eq 'root']"/>
<xsl:variable name="child-decls" select="$root-decl/xs:complexType/xs:sequence/xs:element"/>
<xsl:variable name="decls-after" select="$child-decls[preceding-sibling::xs:element[@name eq 's']]"/>
<xsl:sequence select="*[local-name() = $decls-after/@name]"/>
</xsl:variable>
Это, очевидно, более сложно, но теперь вам не нужно перечислять какие-либо элементы (кроме "s") в вашем коде. Поведение скрипта будет автоматически обновляться всякий раз, когда вы меняете схему (в частности, если вам нужно будет добавить новые элементы). Будет ли это излишним или нет, зависит от вашего проекта. Я предлагаю это просто как дополнительное дополнение. : -)