XSLT 1.0 имеет возможность сортировки. Попробуйте экстраполировать этот пример:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Types">
<xsl:element name="SortedList">
<xsl:for-each select="Type">
<xsl:sort select="Names/Name" />
<xsl:element name="a">
<xsl:attribute name="href">link</xsl:attribute>
<xsl:value-of select="Names/Name" />
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Я не уверен, что именно вы хотите отсортировать, но просто измените атрибут 'select' тега xsl: sort, чтобы указать ключ сортировки.
В качестве альтернативы, если вы пытаетесь форсировать определенный ордер, вы можете просто перебить его:
<xsl:template match="Types">
<xsl:element name="SortedList">
<xsl:apply-templates select="Names[Name='Timber']" />
<xsl:apply-templates select="Names[Name='Bryan']" />
<xsl:apply-templates select="Names[Name='Ryan']" />
</xsl:element>
</xsl:template>
<xsl:template match="Names">
<xsl:element name="a">
<xsl:attribute name="href">link</xsl:attribute>
<xsl:value-of select="Name" />
</xsl:element>
</xsl:template>
Однако, делая это, вы рискуете пропустить что-то или включить что-то дважды. Хотя порядок сортировки достаточно гибкий, вы можете даже отсортировать по
<xsl:sort select="string-length(substring-before(';Timber;Bryan;Ryan',Names/Name))" />
Это утверждение вернет 1 для «Timber», 8 для «Bryan» (длина «; Timber;») и 14 для «Ryan» (длина «; Timber; Bryan;»), и вы можете отсортировать таким образом, чтобы они появлялись в нужном вам порядке. Это решение поместит все, что вы не включили в ваш порядок сортировки, вверху, так как функция 'substring-before' вернет пустую строку, которая, конечно, имеет длину 0. Однако вы должны быть осторожны, чтобы убедиться, что что вы не совпадаете преждевременно, если одна окажется подстрокой другой; например, если бы это было все в нижнем регистре, вы бы слишком рано подобрали 'ryan', так как он будет восприниматься как часть 'bryan'.