请注意:
在这个问题上的要求不包括某些可能的输入,并且由于这两个目前的解决方案 - 迈克尔凯和这个解决方案 - 可以产生不同的结果。
前者产生被始终数字顺序排序(并可能违反造成的交替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