2010-10-18 18 views
2

Notez que j'ai posé une question très similaire plus tôt, mais les exigences ont changé depuisAlphanumeric tri sur valeur de chaîne mixte revisitée

Alphanumeric sort on mixed string value

La principale différence dans les exigences est maintenant que le XML source peut inclure des formulaires avec tous les caractères alpha dans le nom de formulaire ou tous les entiers.

Le form_name peut être saison ouverte sous forme de lettres et de chiffres peuvent être dans un ordre quelconque:

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

XML Compte tenu de:

<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> 

La sortie doit être:

<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> 

Les résultats devraient être dans cet ordre:

  1. formes avec les nombres entiers seulement
  2. formes qui commencent de avec des nombres entiers, mais comprennent également des caractères alpha (peut inclure des espaces)
  3. formes qui ne comprennent que des caractères alpha
  4. formes qui commencent avec un caractère alphabétique mais également inclure entiers (peuvent inclure des espaces)

Les formes similaires sont groupées/triées. J'ai essayé diverses améliorations aux réponses fournies dans ma précédente question référencée, mais je n'ai pas trouvé le bon modèle de filtrage pour les sortes. Les solutions XSLT 2.0 vont bien.

+0

bonne question, +1. Voir ma réponse pour la seule solution correcte jusqu'à présent. :) –

Répondre

0

Cette transformation 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> 

lorsqu'il est appliqué au fichier XML fourni:

<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> 

produit le résultat recherché:

<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>