2012-08-30 25 views
1

我希望有人能够提供帮助。我有一个逗号分隔的字符串,如A10,A12,A11,S10,S11,S12这需要重新排序以S10,A10,S11,A11,S12,A12XSLT - 重新排序逗号分隔字符串

排序判定基准如下,

  • S A每次在增加顺序
  • 年之前,所以9 10之前前11 12 13等之前......之前

所以对于输入XML:

<root> 
    <row>A10,A12,A11,S10,S11,S12</row> 
</root> 

所需的输出:

<root> 
    <row>S10,A10,S11,A11,S12,A12</row> 
</root> 
+0

MMKD,这两个要求可能是矛盾的。例如,如果我们有'A9,A10,A12,A11,S10,S11,S12',并希望结果中的数字部分按递增顺序排列,那么'A9'将在任何'Sn'之前出现。请解释在这种情况下预期的结果是什么? –

+0

这不是问题,因为只有一个'9'。所以只要9在10之前,那就不是问题。第一种应该是在YEAR上,所以'9,10,11,12',那么第二种应该是'S然后N'。 A9 =“Autumn2009”和S10 =“Summer2010”这种方式可以让你在S10之前预期A9,即使S应该在A之前,因为这一年。 – MMKD

回答

3

在2.0:

<xsl:perform-sort select="tokenize(row, ',')"> 
    <xsl:sort select="xs:integer(substring(., 2))"/> 
    <xsl:sort select="substring(., 1, 1)" order="descending"/> 
</xsl:perform-sort> 
1

请注意

在这个问题上的要求不包括某些可能的输入,并且由于这两个目前的解决方案 - 迈克尔凯和这个解决方案 - 可以产生不同的结果。

前者产生被始终数字顺序排序(并可能违反造成的交替SA要求。

该溶液产生的结果,其中SA以该顺序总是交替的,但数字排序要求可能并不总是满足

例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>