我希望有人能帮忙。我有一个逗号分隔的字符串,如A10,A12,A11,S10,S11,S12,需要将它重新排序到S10,A10,S11,A11,S12,A12
订购标准如下,
因此,对于输入XML为:
<root>
<row>A10,A12,A11,S10,S11,S12</row>
</root>期望产出:
<root>
<row>S10,A10,S11,A11,S12,A12</row>
</root>发布于 2012-08-30 12:28:31
在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-30 12:30:56
确实注意到
这个问题中的要求不包括某些可能的输入,正因为如此,目前的两种解决方案--迈克尔·凯( Michael )和这个解决方案--可以产生不同的结果。
前者产生的结果总是按数字排序(并且可能违反交替的S、A要求。
这个解决方案产生的结果是,S和A总是按照这个顺序交替,但数值排序要求可能并不总是满足。
Example1
A8,A10,A12,A11,S9,S10,S11,S12Michael的解决方案产生了
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>https://stackoverflow.com/questions/12195587
复制相似问题