这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="forms">
<xsl:apply-templates>
<xsl:sort select="normalize-space(
translate(@form_name,
'0123456789',
''))"/>
<xsl:sort select="substring-before(
concat(
normalize-space(
translate(@form_name,
translate(@form_name,
'0123456789 ',
''),
'')),
' '),' ')" data-type="number"/>
<xsl:sort select="substring-after(
normalize-space(
translate(@form_name,
translate(@form_name,
'0123456789 ',
''),
'')),
' ')" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
输出:
<FORM lob="BO" form_name="AI OM 10"></FORM>
<FORM lob="BO" form_name="AI OM 98"></FORM>
<FORM lob="BO" form_name="AI OM 107"></FORM>
<FORM lob="BO" form_name="CL BP 00 02"></FORM>
<FORM lob="BO" form_name="CL BP 00 02"></FORM>
<FORM lob="BO" form_name="CL BP 03 01"></FORM>
<FORM lob="BO" form_name="123 DDE"></FORM>
XSLT 2.0 解决方案:这个样式表
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="forms">
<xsl:apply-templates>
<xsl:sort select="string-join(tokenize(@form_name,' ')
[not(. castable as xs:integer)],
' ')"/>
<xsl:sort select="xs:integer(tokenize(@form_name,' ')
[. castable as xs:integer][1])"/>
<xsl:sort select="xs:integer(tokenize(@form_name,' ')
[. castable as xs:integer][2])"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>