2010-04-19 9 views
7

I haben eine Gruppe von Zeichenketten dh g: Linien = '9,1,306, Lucy, G, 38,12'XSLT Sortieren von A & Numerisch Problem

ich brauche die Ausgabe in XSLT um 1,0:

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

Dies ist mein aktueller Code:

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

ich es nur Anzeige ‚1 zu bekommen, 12, 306, 38, 9, G, LUCY "Weil die zweite Sorte nicht abgeholt wird.

Kann mir jemand helfen?

+0

Sie haben nicht numerische Elemente in Ihrer Liste, wie sollen sie numerisch sortiert sein? – Oded

+0

Ich weiß, dass die Elemente sowohl Zahlen als auch Buchstaben sind, ich brauche nur Zahlen, die numerisch sortiert sind, gefolgt von den alphabetisch sortierten Buchstaben. Was muss ich tun, um das – Bryan

Antwort

11

dies nur ein xsl zu erreichen verwenden. Die not() gibt false zurück, wenn die Zeile eine Zahl ist, und true, wenn dies nicht der Fall ist. false wird vor true sortiert, und so kommen die Zahlen zuerst heraus. Wenn Sie diese Art nicht angeben, werden die Buchstaben zuerst angezeigt.

Die nächste xsl: sort sortiert numerisch, und so wird die Zahlen richtig sortieren, aber nicht die Buchstaben (die alle NaN zurückgeben, wenn Nummer() angewendet wird).

Die endgültige xsl: sort wird die Buchstaben alphabetisch sortieren.

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> 

gibt mir

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

Ich denke, das ist, was Sie brauchen, nicht wahr?

+0

passieren ich einen Fehler empfangen wird, wahrscheinlich, weil der Code für 2.0 ist und im mit 1,0 javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: javax.xml .verwandeln.TransformerException: Funktion konnte nicht gefunden werden: Wenn – Bryan

+0

Ich würde es wagen zu sagen, dass Sie sich nie an XSLT 1.0 gewöhnen sollten. Es ist so weit hinter 2.0. Entschuldigung, dass ich dir nicht helfen kann, aber du hast einen ziemlich fortgeschrittenen Wunsch und wenn du bei XSLT 1.0 bleiben willst, hast du vielleicht kein Glück. Sie haben den Trick in der Antwort gesehen: Verwenden Sie nur den Textwert, wenn das Element keine Zahl ist. Wenn ja, gib "nichts" zurück. Wenn Sie also (oder jemand anderen) dies XSLT 1.0 zuordnen können, sollten Sie fertig sein. Ich werde diese Frage aufgeben, da ich nie wieder in den XSLT 1.0 Modus gehen will. Entschuldigung nochmal. – topskip

+0

Nein, ich verstehe, dass meine Firma ein Open-Source-CMS namens Alfresco verwendet und es mir nicht erlaubt, XSLT 2.0 zu verwenden. Danke für Ihre Hilfe. – Bryan

0

In XSLT 1.0 Ich glaube, Sie so etwas wie dieses brauchen:

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

Nummer ($ foo) = Anzahl ($ foo) ist XSLT 1.0 Idiom für die Prüfung, ob ein Wert keine Zahl ist.

Eine andere (sauberere ich denke) Lösung wäre, erste Zahlen zu wählen/sortieren, dann andere.

+0

Der obige Code gab mir diesen Ausgang: 1, 12, 306, 38, 9, G, LUCY – Bryan

0

Ich glaube, das erreicht, was Sie wollen.

Ich spalte zuerst die Auswertung/Sortierung von Zahlen und dann Text Knotenwerte. auf Art Sorten, ob die Linie eine Zahl ist oder nicht: foreach-Anweisung, versuchen Sie Folgendes:

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

Die ersten xsl

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