1

誰かが助けてくれることを願っています。次のようなカンマ区切りの文字列があります。A10,A12,A11,S10,S11,S12これは次のように並べ替える必要がありますS10,A10,S11,A11,S12,A12

注文基準は次のとおりです。

  • 毎回Aの前にS
  • 年が昇順なので、10の前に9、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による2つの現在のソリューションと、このソリューションは、異なる結果を生成する可能性があります。

前者は、常に数値でソートされる結果を生成します(そして、交互SA要件に違反する可能性があります。

このソリューションは、常にこの順序で交互になる結果を生成しSますAが、数値の並べ替え要件が常に満たされるとは限りません。

例1

A8,A10,A12,A11,S9,S10,S11,S12

Michael Kayのソリューションは以下を生成します

A8,S9,S10,A10,S11,A11,S12,A12

ここでは、「常にAの前にS(交互)」の要件が満たされていません

現在のソリューションは以下を生成します

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 に答える