xslt
  • sorting
  • alphanumeric
  • 2010-04-19 4 views 7 likes 
    7

    Ho un gruppo di stringhe cioè g: linee = '9,1,306, LUCY, G, 38,12'XSLT ordine alfabetico e numerico Problemi

    devo l'uscita sia in XSLT 1.0:

    1,9,12,38,306, G, LUCY

    Questo è il mio codice corrente:

    <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']"> 
        <xsl:sort select="g:line"/> 
        <xsl:sort select="number(g:line)" data-type="number"/> 
        <xsl:value-of select="normalize-space(g:line)" /><xsl:text/> 
        <xsl:if test="position()!=last()"><xsl:text>,&#160;</xsl:text></xsl:if> 
    </xsl:for-each> 
    

    posso farlo solo display '1, 12, 306, 38, 9, G, LUCY 'perché il secondo tipo non viene raccolto.

    Chiunque può darmi una mano?

    +0

    Sono presenti elementi non numerici nell'elenco, come devono essere ordinati in ordine numerico? – Oded

    +0

    So che gli articoli sono sia numeri che lettere, ho solo bisogno di numeri ordinati numericamente seguiti dalle lettere in ordine alfabetico. che cosa devo fare per far sì che accada – Bryan

    risposta

    11

    Per raggiungere questo obiettivo utilizzando un solo xsl: istruzione foreach, provare quanto segue:

    <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']"> 
        <xsl:sort select="not(number(g:line))"/> 
        <xsl:sort select="number(g:line)" data-type="number"/> 
        <xsl:sort select="g:line"/> 
        <xsl:value-of select="normalize-space(g:line)" /><xsl:text/> 
        <xsl:if test="position()!=last()"><xsl:text>,&#160;</xsl:text></xsl:if> 
    </xsl:for-each> 
    

    La prima xsl: sort specie se la linea è un numero oppure no. Il not() restituisce false se la linea è un numero e vero se non lo è. false viene ordinato prima del true, quindi i numeri escono per primi. Se ometti questo tipo, le lettere appariranno per prime.

    Il prossimo xsl: ordina ordina numericamente, quindi ordina i numeri correttamente, ma non influenza le lettere (che restituiscono NaN quando viene applicato il numero()).

    L'ultimo xsl: sort ordina le lettere in ordine alfabetico.

    0
    <xsl:template match="/"> 
        <xsl:for-each select="(9,1,306,'LUCY','G',89)" > 
        <xsl:sort select="if (number()) then() else ."/> 
        <xsl:sort select="number(.)" data-type="number" /> 
        <xsl:value-of select="."/> 
        <xsl:value-of select="', '" /> 
        </xsl:for-each> 
    </xsl:template> 
    

    mi dà

    1, 9, 89, 306, G, LUCY,

    credo che sia quello che vi serve, giusto?

    +0

    ho ricevuto un errore, probabilmente perché quel codice è per 2.0 e im utilizzando 1,0 javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: javax.xml .trasformare.TransformerException: Impossibile trovare la funzione: se – Bryan

    +0

    oserei dire che non dovresti mai abituarti a XSLT 1.0. È così lontano dietro 2.0. Scusa se non posso aiutarti, ma hai un desiderio piuttosto avanzato e se vuoi aderire a XSLT 1.0, potresti essere sfortunato. Hai visto il trucco nella risposta: usa il valore del testo solo se l'elemento non è un numero. Se lo è, restituisci "niente". Quindi se tu (o qualcun altro) puoi mappare questo a XSLT 1.0, dovresti farlo. Mi arrendo su questa domanda poiché non voglio mai più entrare in modalità XSLT 1.0. Ancora una volta mi dispiace. – topskip

    +0

    Non ho capito, la mia azienda utilizza un CMS open source chiamato Alfresco e non mi consentirà di utilizzare XSLT 2.0. Grazie per l'aiuto. – Bryan

    0

    In XSLT 1.0 Penso che avete bisogno di qualcosa di simile:!

    <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus']"> 
        <xsl:sort select="g:line[number(g:line) != number(g:line)]"/> 
        <xsl:sort select="g:line[number(g:line) = number(g:line)]" data-type="number"/> 
        <xsl:value-of select="normalize-space(g:line)" /><xsl:text/> 
        <xsl:if test="position()!=last()"><xsl:text>,&#160;</xsl:text></xsl:if> 
    </xsl:for-each> 
    

    numero ($ pippo) = numero ($ foo) è XSLT 1.0 idioma per la prova se un valore non è un numero.

    Un'altra soluzione (più pulita credo) sarebbe quella di selezionare/ordinare i primi numeri, poi altri.

    +0

    Il codice sopra mi ha dato questa uscita: 1, 12, 306, 38, 9, G, LUCY – Bryan

    0

    Credo che questo realizzi ciò che desideri.

    Ho diviso prima la valutazione/i numeri e poi i valori dei nodi di testo.

    <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus'][number(g:line)=number(g:line)]"> 
         <xsl:sort select="g:line" data-type="number" order="ascending"/> 
         <xsl:value-of select="normalize-space(g:line)" /> 
         <xsl:text/> 
         <xsl:if test="position()!=last() or $all_alerts[g:problem!='normal_service'][g:service='bus'][number(g:line)!=number(g:line)]"> 
          <xsl:text>,&#160;</xsl:text> 
         </xsl:if> 
        </xsl:for-each> 
    
        <xsl:for-each select="$all_alerts[g:problem!='normal_service'][g:service='bus'][number(g:line)!=number(g:line)]"> 
         <xsl:sort select="g:line[number(g:line) != number(g:line)]"/> 
         <xsl:value-of select="normalize-space(g:line)" /> 
         <xsl:text/> 
         <xsl:if test="position()!=last()"> 
          <xsl:text>,&#160;</xsl:text> 
         </xsl:if> 
        </xsl:for-each> 
    

     Problemi correlati

    • Nessun problema correlato^_^