2012-08-30 26 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>