1

我希望有人能够提供帮助。我有一个逗号分隔的字符串,例如A10,A12,A11,S10,S11,S12This need to be reordered toS10,A10,S11,A11,S12,A12

订购标准如下,

  • 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>
4

2 回答 2

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>
于 2012-08-30T12:28:31.580 回答
1

请注意

此问题中的要求不涵盖某些可能的输入,因此,两个当前的解决方案 - Michael Kay 和此解决方案 - 可能会产生不同的结果。

前者产生的结果总是按数字排序(并且可能违反交替SA要求。

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>
于 2012-08-30T12:30:56.477 回答