Это преобразование :
<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:param name="pSortingValues" select="'C,A,B'"/>
<xsl:variable name="vSortingValues" select=
"concat(',', $pSortingValues, ',')"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*">
<xsl:sort data-type="number" select=
"string-length(substring-before($vSortingValues,concat(',',name,',')))"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<root>
<element>
<name>A</name>
</element>
<element>
<name>B</name>
</element>
<element>
<name>C</name>
</element>
</root>
дает желаемые, правильные результаты :
<root>
<element>
<name>C</name>
</element>
<element>
<name>A</name>
</element>
<element>
<name>B</name>
</element>
</root>
Примечание :
Список требуемых отсортированных значений - это глобальный параметр pSortingValues
, который может быть предоставлен для преобразования извне.
Правило идентификации используется для копирования всех узлов "как есть".
Правило идентификации переопределяется для верхнего элемента . Верхний элемент частично копируется, его атрибуты копируются, затем шаблоны применяются ко всем дочерним элементам с помощью дочерней инструкции <xsl:sort>
, которая указывает точный используемый ключ сортировки - как перед значениями pSortingValues
имя ребенка element
.
ОБНОВЛЕНИЕ : Как отмечает @Alejandro, это:
<xsl:sort data-type="number" select=
"string-length(substring-before($vSortingValues,concat(',',name,',')))"/>
можно упростить до этого:
<xsl:sort data-type="number" select=
"substring-before($vSortingValues,concat(',',name,','))"/>