2010-10-18 72 views
2

需要注意的是我一个非常类似的问题早先提出,但要求也从此改变字母排序重新

Alphanumeric sort on mixed string value

在需求的主要区别是现在,源XML可以包括与形式所有字符串在form_name或所有整数。

的FORM_NAME可以开季字母和数字可以以任意顺序:

XX ## ## 
XX XX ## 
XX XX ### 
XX XX ## ## 
XX ### 
XX XXXX 
## XXX 
XXX### 
XXX 
### 

由于XML:

<forms> 
<FORM lob="BO" form_name="AI OM 10"/> 
<FORM lob="BO" form_name="CL BP 03 01"/> 
<FORM lob="BO" form_name="AI OM 107"/> 
<FORM lob="BO" form_name="CL BP 00 02"/> 
<FORM lob="BO" form_name="123 DDE"/> 
<FORM lob="BO" form_name="CL BP 00 02"/> 
<FORM lob="BO" form_name="AI OM 98"/> 
<FORM lob="BO" form_name="543 ZZE"/> 
<FORM lob="BO" form_name="543 ABC"/> 
<FORM lob="BO" form_name="256"/> 
<FORM lob="BO" form_name="ABC"/> 
</forms> 

输出应该是:

<forms> 
    <FORM lob="BO" form_name="256"/> 
    <FORM lob="BO" form_name="123 DDE"/> 
    <FORM lob="BO" form_name="543 ABC"/> 
    <FORM lob="BO" form_name="543 ZZE"/> 
    <FORM lob="BO" form_name="ABC"/> 
    <FORM lob="BO" form_name="AI OM 10"/> 
    <FORM lob="BO" form_name="AI OM 98"/> 
    <FORM lob="BO" form_name="AI OM 107"/> 
    <FORM lob="BO" form_name="CL BP 00 02"/> 
    <FORM lob="BO" form_name="CL BP 00 02"/> 
    <FORM lob="BO" form_name="CL BP 03 01"/> 
</forms> 

结果应按以下顺序排列:

  1. 形成与仅整数
  2. 形式的开始与整数而且还包括字母字符(可以包括空格)
  3. 形式仅包括字母字符
  4. 形式的开始以字母字符,但还包括整数(可以包含空格)

因此,表单被分组/排序。我已经尝试了各种增强功能来提供我在前面提到的问题中提供的答案,但没有找到适合这种排序的正确过滤模式。 XSLT 2.0解决方案很好。

+0

好问题,+1。看到我的答案是迄今唯一正确的解决方案。 :) – 2010-10-18 17:59:46

回答

0

这XSLT 1.0转化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:variable name="vAlha" select= 
    "' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 
    "/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <forms> 
    <xsl:apply-templates select="*[floor(@form_name) = floor(@form_name)]"> 
     <xsl:sort data-type="number"/> 
    </xsl:apply-templates> 

    <xsl:apply-templates select= 
     "*[substring-before(@form_name,' ') 
     and 
     translate(substring-before(@form_name,' '), 
        '', 
        '') 
     = 
     '' 
     ]"> 
     <xsl:sort select="substring-before(@form_name,' ')" data-type="number"/> 
     <xsl:sort select="substring-after(@form_name,' ')"/> 
    </xsl:apply-templates> 

    <xsl:apply-templates select= 
    "*[translate(@form_name,$vAlha,'') 
     = 
     '' 
     ]"> 
     <xsl:sort select="@form_name"/> 
    </xsl:apply-templates> 

    <xsl:apply-templates select= 
    "*[contains($vAlha,substring(@form_name,1,1)) 
    and 
     not(translate(@form_name, $vAlha, '') = '') 
     ]"> 
     <xsl:sort select="translate(@form_name, '', '')"/> 
     <xsl:sort select="translate(@form_name, $vAlha, '')" data-type="number"/> 
    </xsl:apply-templates> 
    </forms> 
</xsl:template> 
</xsl:stylesheet> 

当施加到所提供的XML文件

<forms> 
    <FORM lob="BO" form_name="AI OM 10"/> 
    <FORM lob="BO" form_name="CL BP 03 01"/> 
    <FORM lob="BO" form_name="AI OM 107"/> 
    <FORM lob="BO" form_name="CL BP 00 02"/> 
    <FORM lob="BO" form_name="123 DDE"/> 
    <FORM lob="BO" form_name="CL BP 00 02"/> 
    <FORM lob="BO" form_name="AI OM 98"/> 
    <FORM lob="BO" form_name="543 ZZE"/> 
    <FORM lob="BO" form_name="543 ABC"/> 
    <FORM lob="BO" form_name="256"/> 
    <FORM lob="BO" form_name="ABC"/> 
</forms> 

产生想要的结果

<forms> 
    <FORM lob="BO" form_name="256"></FORM> 
    <FORM lob="BO" form_name="123 DDE"></FORM> 
    <FORM lob="BO" form_name="543 ABC"></FORM> 
    <FORM lob="BO" form_name="543 ZZE"></FORM> 
    <FORM lob="BO" form_name="ABC"></FORM> 
    <FORM lob="BO" form_name="AI OM 10"></FORM> 
    <FORM lob="BO" form_name="AI OM 98"></FORM> 
    <FORM lob="BO" form_name="AI OM 107"></FORM> 
    <FORM lob="BO" form_name="CL BP 00 02"></FORM> 
    <FORM lob="BO" form_name="CL BP 00 02"></FORM> 
    <FORM lob="BO" form_name="CL BP 03 01"></FORM> 
</forms>