注意してください:
この質問の要件は、特定の可能な入力をカバーしていません。これにより、Michael Kayによる2つの現在のソリューションと、このソリューションは、異なる結果を生成する可能性があります。
前者は、常に数値でソートされる結果を生成します(そして、交互S
のA
要件に違反する可能性があります。
このソリューションは、常にこの順序で交互になる結果を生成しS
ますA
が、数値の並べ替え要件が常に満たされるとは限りません。
例1:
A8,A10,A12,A11,S9,S10,S11,S12
Michael Kayのソリューションは以下を生成します:
A8,S9,S10,A10,S11,A11,S12,A12
ここでは、「常にAの前にS(交互)」の要件が満たされていません
現在のソリューションは以下を生成します:
S9,A8,S10,A10,S11,A11,S12,A12
ここでは、交互の要件は満たされていますが、数値の並べ替えの要件は満たされていません。
この変換:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vTokens" select="tokenize(/*/row, ',')"/>
<xsl:variable name="vASeq" as="xs:string*">
<xsl:perform-sort select="$vTokens[starts-with(.,'A')]">
<xsl:sort select="substring(.,2)" data-type="number"/>
</xsl:perform-sort>
</xsl:variable>
<xsl:variable name="vSSeq" as="xs:string*">
<xsl:perform-sort select="$vTokens[starts-with(.,'S')]">
<xsl:sort select="substring(.,2)" data-type="number"/>
</xsl:perform-sort>
</xsl:variable>
<xsl:template match="/">
<root>
<row>
<xsl:sequence select=
"string-join(
(for $i in 1 to count($vSSeq)
return
($vSSeq[$i], $vASeq[$i])
),
','
)
"/>
</row>
</root>
</xsl:template>
</xsl:stylesheet>
提供されたXMLドキュメントに適用した場合:
<root>
<row>A10,A12,A11,S10,S11,S12</row>
</root>
必要な正しい結果を生成します。
<root>
<row>S10,A10,S11,A11,S12,A12</row>
</root>