请注意:
此问题中的要求不涵盖某些可能的输入,因此,两个当前的解决方案 - Michael Kay 和此解决方案 - 可能会产生不同的结果。
前者产生的结果总是按数字排序(并且可能违反交替S
的A
要求。
S
此解决方案产生的结果A
总是按此顺序交替,但可能并不总是满足数字排序要求。
示例 1:
A8,A10,A12,A11,S9,S10,S11,S12
Michael Kay 的解决方案产生:
A8,S9,S10,A10,S11,A11,S12,A12
这里没有满足“S 总是在 A(交替)之前”的要求
当前的解决方案产生:
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>