0
給定XML,其中FORMNUMBER只能是數字;從數字開始,然後包含alpha;或遵循一個數字字母數字圖案:混合字符串值的字母數字排序:字母數字字母
<FORMSLIST>
<FORMS>
<FORMNUMBER>3 ABC</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>12 ABC 45</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>3 XYZ</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>18</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>326</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>21 B</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>12 EFG 79</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>3 ABCD</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
</FORMSLIST>
這是我的樣式表(上Alphanumeric sort on mixed string value revisited變化):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="vAlpha" select="' ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:for-each-group select="FORMSLIST/FORMS" group-by="FORMSEQ">
<xsl:sort select="FORMSEQ" data-type="number"/>
<!-- NEED HELP WITH THE FOLLOWING SORT -->
<xsl:for-each select="current-group()[(floor(number(FORMNUMBER)) = floor(number(FORMNUMBER))) or (substring-before(FORMNUMBER,' ') and translate(substring-before(FORMNUMBER,' '),'','') = '')]">
<xsl:sort select="translate(FORMNUMBER, $vAlpha, '')" data-type="number"/>
<xsl:sort select="substring-after(FORMNUMBER,' ')"/>
<xsl:element name="{local-name()}">
<xsl:copy-of select="*"/>
</xsl:element>
</xsl:for-each>
<!-- THIS SORT WORKS AND I DON'T HAVE QUESTIONS ON THIS: ALPHA ONLY FORMS; BEGIN WITH ALPHA AND THEN GO TO NUMERIC...MAY ALSO GO BACK TO ALPHA -->
<xsl:for-each select="current-group()[contains($vAlpha,substring(FORMNUMBER,1,1)) or (translate(FORMNUMBER, $vAlpha, '') = '')]">
<xsl:sort select="translate(FORMNUMBER, '', '')"/>
<xsl:sort select="translate(FORMNUMBER, $vAlpha, '')" data-type="number"/>
<xsl:element name="{local-name()}">
<xsl:copy-of select="*"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
將所得變換是:
<FORMSLIST>
<FORMS>
<FORMNUMBER>3 ABC</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>3 ABCD</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>3 XYZ</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>18</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>21 B</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>326</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>12 ABC 45</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>12 EFG 79</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
</FORMSLIST>
我期望的結果將是在排序中包含'12 ABC 45'和'12 EFG 79'表格(列表首先按開頭數字排序):
<FORMSLIST>
<FORMS>
<FORMNUMBER>3 ABC</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>3 ABCD</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>3 XYZ</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>12 ABC 45</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>12 EFG 79</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>18</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>21 B</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
<FORMS>
<FORMNUMBER>326</FORMNUMBER>
<FORMSEQ>99900</FORMSEQ>
</FORMS>
</FORMSLIST>
我已經嘗試了許多變化,但似乎無法得到它的工作。
太棒了,它的工作!更容易。謝謝 – johkar 2010-10-27 20:32:51
@johkar:cool!很高興它解決了你的問題。 – LarsH 2010-10-27 20:41:49
+1好答案。 – 2010-10-27 21:10:45