This transformation:
这个转换:
<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,','))"/>