注: OP はサンプル XML を提供するようになりました。以下の理論は、この XML に簡単に適用できます。
I. XSLT 1.0 (パート 1)
これは、あなたの主張(「コードには4つの文字と4つの数字があります」)が常に当てはまると仮定する簡単なソリューションです。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:variable name="vNums" select="'1234567890'" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<t>
<xsl:apply-templates>
<xsl:sort select="substring(., 5)"
data-type="number" />
</xsl:apply-templates>
</t>
</xsl:template>
</xsl:stylesheet>
...想像上の XML ドキュメントに適用され、ランダムな順序でシャッフルされます。
<?xml version="1.0" encoding="utf-8"?>
<t>
<i>COMP3410</i>
<i>LAWS2202</i>
<i>COMP2400</i>
<i>COMP2100</i>
<i>LAWS2250</i>
</t>
...正しい結果が生成されます。
<?xml version="1.0" encoding="utf-8"?>
<t>
<i>COMP2100</i>
<i>LAWS2202</i>
<i>LAWS2250</i>
<i>COMP2400</i>
<i>COMP3410</i>
</t>
説明:
- XSLT の最も基本的なデザイン パターンの
Identity Transform
1 つである (そうでない場合) は、すべてのノードをソース XML ドキュメントから結果の XML ドキュメントにそのままコピーします。
<t>
1 つのテンプレートは、文字列内の文字に基づいて位置 5 から文字列の末尾までのすべての子を並べ替えることによって、Identity Transform をオーバーライドします。
繰り返しますが、この解決策は、元の主張-「コードには4つの文字と4つの数字があります」-が真実である(そして常に真実である)ことを前提としていることに注意してください。
Ⅱ.XSLT 1.0 (パート 2)
<i>
(潜在的に) より安全な解決策は、ノード内のさまざまな位置に数字以外の文字が多数存在する可能性があると想定することです。その場合、この XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:variable name="vNums" select="'1234567890'" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<t>
<xsl:apply-templates>
<xsl:sort select="translate(., translate(., $vNums, ''), '')"
data-type="number" />
</xsl:apply-templates>
</t>
</xsl:template>
</xsl:stylesheet>
...同じ結果が得られます。
<?xml version="1.0" encoding="utf-8"?>
<t>
<i>COMP2100</i>
<i>LAWS2202</i>
<i>LAWS2250</i>
<i>COMP2400</i>
<i>COMP3410</i>
</t>
説明:
III. XSLT 2.0 ソリューション
XSLT 2.0 ソリューションは、XSLT 1.0 ソリューションのパート 2 と非常によく似ています。Double Translate メソッドを正規表現を処理する XPath 2.0 の機能に置き換えるだけです。
<xsl:sort select="replace(., '[^\d]', '')" data-type="number" />
XPath 2.0 で正規表現を使用する必要は決してないことに注意してください。Double Translate Method は、XPath 1.0 と同様に機能します。ただし、このreplace()
方法はおそらくより効率的です。