jürgi: Sortieren von Zahlenwerten mit vorangestelltem Euro-Zeichen

...einmal mehr ich mit ner kleinen frage. ;-)

ich möchte meine xml-datei bei der ausgabe nach html sortieren. dabei soll aufsteigend nach dem preis sortiert werden. das klappt auch schon ganz gut bei dreistelligen preisen (z.B. € 899). sobald eine vierte stelle hinzukommt (z.B. € 1019) wird dieses information an erster stelle gebracht. dann jedoch wird aufsteigend sortiert!

ich vermute, das liegt an dem euro-symbol aber leider hab ich bis jetzt noch nicht herausgefunden, warum!

grüße
der jürgi

mein xsl:

...  
<xsl:template match="root">  
  <root>  
    <xsl:apply-templates select="waschmaschine">  
      <xsl:sort select="preis" data-type="text" order="ascending"/>  
    </xsl:apply-templates>  
  </root>  
</xsl:template>  
  
<xsl:template match="waschmaschine">  
  <xsl:copy-of select="."/>  
</xsl:template>  
...

______________________________

meine xml:

<root>  
<waschmaschine>  
<hersteller>AEG</hersteller>  
<typ>LAVAMAT 6261</typ>  
Beschreibung: <beschreibung>Waschvollautomat mit 1200 U/min, Waschwirkungsklasse A, 6 kg Fassungsvermögen.Vollelektronische Ein-Knopf-Programmsteuerung für einfachste Bedienung.</beschreibung>  
Bestellnummer: <bestellnummer>ae0023154</bestellnummer>  
Preis: <preis currency="Euro">€ 479</preis>  
<preis_visual>€ 479</preis_visual>  
<foto href="file:///K:/Waschmaschinen/24469_g.jpg"></foto>  
 </waschmaschine>  
 <waschmaschine>  
...
  1. Hi,

    ich vermute, das liegt an dem euro-symbol aber leider hab ich bis jetzt noch nicht herausgefunden, warum!

    die Zeichenkette "€ 8" ist größer als "€ 1", also braucht man keine weiteren Text(!)zeichen zu betrachten. Wenn Du Zahlen vergleichen willst, musst Du zunächst den Text in etwas umwandeln, dass als Zahl durchgeht.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. hi cheatah!

      ...dann müsste doch der wert "€ 1019" größer als "€ 999" sein und demnach als letzter kommen, wenn ich aufsteigend sortiere?!

      grüße
      der jürgi

      Hi,

      ich vermute, das liegt an dem euro-symbol aber leider hab ich bis jetzt noch nicht herausgefunden, warum!

      die Zeichenkette "€ 8" ist größer als "€ 1", also braucht man keine weiteren Text(!)zeichen zu betrachten. Wenn Du Zahlen vergleichen willst, musst Du zunächst den Text in etwas umwandeln, dass als Zahl durchgeht.

      Cheatah

      1. @@jürgi:

        nuqneH

        hi cheatah!

        ...dann müsste doch der wert "€ 1019" größer als "€ 999" sein und demnach als letzter kommen, wenn ich aufsteigend sortiere?!

        Nein. "Quickie" steht im Wörterbuch auch vor "Quietscheentchen".

        Bei Stringvergleichen geht es von links nach rechts*:
        "Q" bei beiden gleich, also nächsten Buchstaben anschauen
        "u" bei beiden gleich, also nächsten Buchstaben anschauen
        "i" bei beiden gleich, also nächsten Buchstaben anschauen
        "c" kommt vor "e", also "Quickie" vor "Quietscheentchen"

        Entsprechend:
        "€" bei beiden gleich, also nächstes Zeichen anschauen
        " " bei beiden gleich, also nächstes Zeichen anschauen
        "1" kommt vor "9", also "€ 1019" vor "€ 999"

        Qapla'

        * arabische, hebräische u.a. Von-rechts-nach-links-Schriften ausgenommen

        --
        Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
        1. hallo gunnar!

          ..danke für die info - jetzt hab ich's auch kapiert! :o) kennst du eine lösung, wie man dennoch die preise aufsteigend sortieren lassen kann?

          danke und gruß
          der jürgi

          @@jürgi:

          nuqneH

          hi cheatah!

          ...dann müsste doch der wert "€ 1019" größer als "€ 999" sein und demnach als letzter kommen, wenn ich aufsteigend sortiere?!

          Nein. "Quickie" steht im Wörterbuch auch vor "Quietscheentchen".

          Bei Stringvergleichen geht es von links nach rechts*:
          "Q" bei beiden gleich, also nächsten Buchstaben anschauen
          "u" bei beiden gleich, also nächsten Buchstaben anschauen
          "i" bei beiden gleich, also nächsten Buchstaben anschauen
          "c" kommt vor "e", also "Quickie" vor "Quietscheentchen"

          Entsprechend:
          "€" bei beiden gleich, also nächstes Zeichen anschauen
          " " bei beiden gleich, also nächstes Zeichen anschauen
          "1" kommt vor "9", also "€ 1019" vor "€ 999"

          Qapla'

          * arabische, hebräische u.a. Von-rechts-nach-links-Schriften ausgenommen

          1. @@jürgi:

            nuqneH

            ..danke für die info - jetzt hab ich's auch kapiert! :o) kennst du eine lösung, wie man dennoch die preise aufsteigend sortieren lassen kann?

            "€ " vorn abschneiden [XPATH §3.6], den Rest numerisch sortieren [XSLT10 §10]

            Qapla'

            PS: Bitte kein TOFU!

            --
            Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
          2. Hallo Jürgi,

            kennst du eine lösung, wie man dennoch die preise aufsteigend sortieren lassen kann?

            <xsl:sort select="number(substring-after(preis,'€ '))" data-type="number" order="ascending"/>

            Grüße,
            Thomas

            1. Hallo Thomas,

              <xsl:sort select="number(substring-after(preis,'€ '))" data-type="number" order="ascending"/>»»

              danke, du bist mein retter! :-)

              Schönen Abend und liebe Grüße
              Jürgen

  2. Hi,

    [code lang=xml]<root>
    <waschmaschine>
    <hersteller>AEG</hersteller>
    <typ>LAVAMAT 6261</typ>
    Beschreibung: <beschreibung>Waschvollautomat mit 1200 U/min, Waschwirkungsklasse A, 6 kg Fassungsvermögen.Vollelektronische Ein-Knopf-Programmsteuerung für einfachste Bedienung.</beschreibung>

    Wieso steht hier Beschreibung: vor dem beschreibung-Element im xml? Ist doch überflüssig.
    (Mixed content, d.h. Elemente, die sowohl Text als auch Kind-Elemente enthalten, würde ich sowieso zu vermeiden versuchen, wann immer es geht).

    Wenn das "Beschreibung:" in der Ausgabe benötigt wird, gehört das m.E. in die Transformation, aber nicht in die Datenquelle ...

    Bestellnummer: <bestellnummer>ae0023154</bestellnummer>

    Dito.

    Preis: <preis currency="Euro">€ 479</preis>

    Dito.
    Und die Währung ist auch gleich doppelt angegeben - einmal im currency-Attribut, einmal im Textknoten. Warum? Laß die zweite Angabe weg - dafür hast Du doch eh schon das (m.E. überflüssige):

    <preis_visual>€ 479</preis_visual>

    M.E. wäre es, wenn irgendwie möglich, am sinnvollsten, das xml erstmal aufzuräumen.
    Als Nebenwirkung erledigt sich Dein Problem, da im preis-Element dann nur noch die Zahl drinsteht ...

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.