[XSL] Sortierung zuerst alphanumerisch, dann numerisch

xXMrJackXx

Grünschnabel
Hallo,

ich habe ein kleines Problem beim <xsl:sort>
Ich habe z.B. folgende xml-Daten

Code:
<data>
   <key>12AB</key>
   <key>A12B</key>
   <key>BA12</key>
   <key>2AB1</key>
</data>

Mein Code sieht folgendermaßen aus:
Code:
<xsl:for-each select="data/key">
   <xsl:sort select="."/>
   <xsl:value-of select="."/>
</xsl:for-each>

Dadurch bekomme ich folgende Ausgabe:
Code:
12AB
2AB1
A12B
BA12

Ich möchte aber, dass zuerst die Werte mit alphanumerischen Zeichen am Beginn kommen und dann die numerischen:
Code:
A12B
BA12
12AB
2AB1

Ich hoffe, mein Problem ist verständlich

Danke
 
Hallo,

wenn in den KEY-Knoten nur Großbuchstaben als Alphazeichen möglich sind, dann könntest du mit der translate-Funktion die numerischen Zeichen z.B. in Kleinbuchstaben umsetzen, etwa so:
XML:
<xsl:for-each select="data/key">
  <xsl:sort select="translate(.,'0123456789','abcdefghij')" data-type="text" case-order="upper-first" />
  <xsl:copy-of select="." />
</xsl:for-each>
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Antwort.
Da gibt's nur leider ein Problem.
Damit bekomme ich z.B. folgende Sortierung:
Code:
A12B
BA12
12AB
2AB1
DA23
3333

Bei Angabe von "upper-first" wird nämlich "A a B b C c" sortiert und nicht "A B C a b c" (was ich eigentlich benötigen würde; es sollten zuerst ALLE Alphazeichen sein, dann die Nummern).
 
Hallo,

tut mir leid, da muss ich passen: Ich wende XSL nur in der Version 1 im Zusammenhang mit LIBXSLT an. In der XSL-Version 2 kann man bei der Sortierung eine Kollation angeben, aber damit habe ich keine Erfahrung.
--> Use custom collations in XSLT 2.0
... es sollten zuerst ALLE Alphazeichen ...
Was bedeutet das? Alle UTF-8-Alphazeichen? Das kann ich kaum glauben. Mit einer endlichen Zeichenanzahl in den KEY-Knoten könnte man evtl. (mit XSLT v1) eine neues Sortierkriterium als Attribut erzeugen, das ist aber sicherlich recht umständlich. Ich würde deshalb diese Sortierung in der umgebenden Programmiersprache vornehmen.
 
Zurück