請注意:
在這個問題上的要求不包括某些可能的輸入,並且由於這兩個目前的解決方案 - 邁克爾凱和這個解決方案 - 可以產生不同的結果。
前者產生被始終數字順序排序(並可能違反造成的交替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>
MMKD,這兩個要求可能是矛盾的。例如,如果我們有'A9,A10,A12,A11,S10,S11,S12',並希望結果中的數字部分按遞增順序排列,那麼'A9'將在任何'Sn'之前出現。請解釋在這種情況下預期的結果是什麼? –
這不是問題,因爲只有一個'9'。所以只要9在10之前,那就不是問題。第一種應該是在YEAR上,所以'9,10,11,12',那麼第二種應該是'S然後N'。 A9 =「Autumn2009」和S10 =「Summer2010」這種方式可以讓你在S10之前預期A9,即使S應該在A之前,因爲這一年。 – MMKD