首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -重新排序逗号分隔的字符串

XSLT -重新排序逗号分隔的字符串
EN

Stack Overflow用户
提问于 2012-08-30 11:12:51
回答 2查看 518关注 0票数 1

我希望有人能帮忙。我有一个逗号分隔的字符串,如A10,A12,A11,S10,S11,S12,需要将它重新排序到S10,A10,S11,A11,S12,A12

订购标准如下,

  • ‘每次都是在A之前
  • 年增长顺序:10年前9岁之前11岁之前12岁之前13岁等。

因此,对于输入XML为:

代码语言:javascript
复制
<root>
    <row>A10,A12,A11,S10,S11,S12</row>
</root>

期望产出:

代码语言:javascript
复制
<root>
    <row>S10,A10,S11,A11,S12,A12</row>
</root>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-30 12:28:31

在2.0中:

代码语言:javascript
复制
<xsl:perform-sort select="tokenize(row, ',')">
  <xsl:sort select="xs:integer(substring(., 2))"/>
  <xsl:sort select="substring(., 1, 1)" order="descending"/>
</xsl:perform-sort>
票数 3
EN

Stack Overflow用户

发布于 2012-08-30 12:30:56

确实注意到

这个问题中的要求不包括某些可能的输入,正因为如此,目前的两种解决方案--迈克尔·凯( Michael )和这个解决方案--可以产生不同的结果。

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

这个解决方案产生的结果是,SA总是按照这个顺序交替,但数值排序要求可能并不总是满足。

Example1

代码语言:javascript
复制
A8,A10,A12,A11,S9,S10,S11,S12

Michael的解决方案产生了

代码语言:javascript
复制
A8,S9,S10,A10,S11,A11,S12,A12

这里"S总是在A之前(交替)“的要求没有得到满足。

当前解决方案生成

代码语言:javascript
复制
S9,A8,S10,A10,S11,A11,S12,A12

在这里,交替要求得到了满足,但数字排序要求却没有实现。

这个转换

代码语言:javascript
复制
<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文档上应用时

代码语言:javascript
复制
<root>
    <row>A10,A12,A11,S10,S11,S12</row>
</root>

生成想要的、正确的结果:

代码语言:javascript
复制
<root>
   <row>S10,A10,S11,A11,S12,A12</row>
</root>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12195587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档