# XML/XSL und Zahlenformat



## fluppi_one (26. September 2006)

Hallo,

ich habe leider ein kleines Problem beim Umwandeln bzw. herausfiltern von Daten aus einem XML-File. Alles funktioniert wunderbar, bis auf folgendes:

Ich bekomme Zahlen z.B. im Format:

<VALUE>115</VALUE>
<NUMOFDEC>2</NUMOFDEC> und

möchte das ganze umwandeln, so dass ich den Wert mittels xsl
in 1.15 bekomme.

Wie könnte ich das ganze hinbekommen?

Gruß Florian


----------



## deepthroat (26. September 2006)

Hi.

Könntest du so machen:
	
	
	



```
<xsl:value-of select="format-number(concat(VALUE, 'e-', NUMOFDEC), '#0.0#')" />
```
Gruß


----------



## fluppi_one (27. September 2006)

Hmm,

danke, aber scheint leider nicht zu funktionieren.
Als Ergebnis erhalte ich immer den Wert NaN  .



```
- <POORDERLIN>
+ <QUANTITY qualifier="ORDERED">
  <VALUE>5</VALUE> 
  <NUMOFDEC>0</NUMOFDEC> 
  <SIGN>+</SIGN> 
  <UOM>CT</UOM> 
  </QUANTITY>
- <OPERAMT qualifier="UNIT" type="T">
  <VALUE>11125</VALUE> 
  <NUMOFDEC>3</NUMOFDEC> 
  <SIGN>+</SIGN> 
  <CURRENCY>EUR</CURRENCY> 
  <UOMVALUE>1</UOMVALUE> 
  <UOMNUMDEC>0</UOMNUMDEC> 
  <UOM>CT</UOM>
```
Hier steht der Wert drin....
Ich leite den "Baum" mit 

<xsl:for-each select="DATAAREA[1]/PROCESS_PO[1]/POORDERLIN">
ein

Dann habe ich Deinen Wert mit eingebaut:
...

<xsl:for-each select="OPERAMT[1]">
<xsl:value-of select="format-number(concat(VALUE, 'e-', NUMOFDEC), '#0.0#')" /> 
</xsl:for-each>

Und heraus kommt besagtes NaN.

Alles andere wird sonst einwandfrei konvertiert....

EDIT: Also es muss an dem Befehl format-number liegen... Lass ich Ihn weg bekomm ich z.B. 11125 -e raus. Also findet er die Daten...


----------



## deepthroat (27. September 2006)

Also bei mir wird für dein Beispiel erwartungsgemäß 11.13 ausgegeben.

Wenn ich den format-number Aufruf weg lasse, wird erwartungsgemäß 1125e-3 ausgegeben - es ist mir unverständlich wie bei dir 1125-e herauskommen kann?! Kann es sein das du den Code doch nicht richtig übernommen hast? Welchen XSLT Prozessor verwendest du denn?

Gruß

PS: Bitte verwende für Code den du postest die entsprechenden Code-Tags - für XML also [code=xml]...[/code].


----------



## fluppi_one (27. September 2006)

Hallo,

ich habe glaub ich den Fehler gefunden. 
Ich wandel das ganze unter JAVA (Linux) um.XSLT-Prozessor ist xalan

Ich müsste doch eigentlich in der xsl-Datei einen Wert 
ála


```
<xsl:decimal-format name="european" decimal-separator="." grouping-separator="."/>
```

eintragen oder?


----------



## deepthroat (27. September 2006)

Das xsl:decimal-format Element definiert nur das Standardformat für die Ausgabe von Dezimalzahlen. Du solltest da nicht das gleiche Zeichen als Tausendertrennzeichen und Dezimaltrennzeichen verwenden (obwohl das vermutlich funktioniert - ist aber bestenfalls irreführend).

Das Problem ist, das bei dir keine korrekte Gleitkommazahl beim Zusammenbauen entsteht.

Wenn bei dir wirklich der String "11125 -e" herauskommt (Wo kommt da das Leerzeichen her? Wieso steht das Minus vor dem e?) dann schlägt die Umwandlung in eine Zahl natürlich fehl.

Gruß


----------



## fluppi_one (27. September 2006)

Hmm,

also ich habe Deinen Code jetzt direkt nochmal eingefügt

Verpackungseinheit 2.500Bl|5|CT|NaN|1|||

Dort, wo NaN steht, sollte eigentlich 11,13€ stehen. Tut es leider nur nicht.
Ich fürchte, das hier das "e-" falsch interpretiert wird.

Und ich weiss leider nicht woran das liegt. Lass ich das "e-" weg schreibt er die Zahlen hin (die ich natürlich so nicht gebrauchen kann...)


----------



## deepthroat (27. September 2006)

fluppi_one hat gesagt.:


> Dort, wo NaN steht, sollte eigentlich 11,13€ stehen. Tut es leider nur nicht.
> Ich fürchte, das hier das "e-" falsch interpretiert wird.
> 
> Und ich weiss leider nicht woran das liegt.


Das ist mir schon klar. Deshalb hab ich dir ja auch ein paar Fragen gestellt - du erzählst mir aber nur wieder das es nicht funktioniert  

Was kommt denn heraus wenn du "format-number('1115e-5', '##0.0####')" fest in das select Attribut schreibst?

Was genau kommt heraus wenn du den format-number Aufruf wegläßt?

Gruß


----------



## fluppi_one (27. September 2006)

Ok,

also hier mal folgende Ergebnisse:
1.) Ohne format-number


```
<xsl:value-of select="concat(VALUE, 'e-', NUMOFDEC)" />
```

wird es in 
Verpackungseinheit 2.500Bl|5|CT|11125e-3|1|||

umgewandelt

2.) format-number direkt in select-Attribut ergibt als Ergebnis

Verpackungseinheit 2.500Bl|5|CT|NaN|1|||


----------



## deepthroat (27. September 2006)

Ok, so kommen wir schon weiter.

Welche Version von Xalan ist das denn? Ist das schon ein XSL 2.0 Stylesheet/Prozessor?

Was kommt heraus wenn du "number(concat(VALUE, 'e-', NUMOFDEC))" hinschreibst? Oder "xs:double(concat(VALUE, 'e-', NUMOFDEC))"?

Gruß


----------



## fluppi_one (27. September 2006)

Hallo,

Xalan ist in der Version 2.6.0 installiert und unterstützt XSLT 1.0.

"number(concat(VALUE, 'e-', NUMOFDEC))" gibt :

Verpackungseinheit 2.500Bl|5|CT|NaN|1||| wieder

während er xs:double garnicht akzeptiert und die Transformierung garnicht vornimmt.


----------



## deepthroat (27. September 2006)

fluppi_one hat gesagt.:


> Hallo,
> 
> Xalan ist in der Version 2.6.0 installiert und unterstützt XSLT 1.0.
> 
> ...


Gut. Da ist mein 1.0 XSLT Prozessor (xsltproc) wohl etwas übers Ziel hinausgeschossen und unterstützt Java IEEE 754 Gleitkommaliterale - während in der XPath 1.0 Empfehlung vom W3C steht das ein Zahlenliteral nur aus Ziffern und Dezimalpunkt bestehen darf (http://www.w3.org/TR/xpath#function-number).

Dann probier's mal so:
	
	
	



```
<xsl:value-of select="concat(substring(VALUE, 1, string-length(VALUE) - numofdec), '.', substring(VALUE, string-length(VALUE) - NUMOFDEC + 1))"/>
```



fluppi_one hat gesagt.:


> während er xs:double garnicht akzeptiert und die Transformierung garnicht vornimmt.


Das ist OK, da das auch nur für XSL 2.0 gedacht war.

Gruß


----------



## fluppi_one (27. September 2006)

Super,

funktioniert. Vielen Dank 
Ich habe mir aber erlaubt, numofdec in NUMOFDEC umzuändern, sonst habe ich nichts mehr vor dem Punkt 

Gruß


----------



## deepthroat (27. September 2006)

fluppi_one hat gesagt.:


> Ich habe mir aber erlaubt, numofdec in NUMOFDEC umzuändern, sonst habe ich nichts mehr vor dem Punkt


Ups. Bei mir hab ich das zum Ausprobieren alles klein geschrieben und hab wohl dann beim posten das eine numofdec vergessen in Großbuchstaben zu ändern... 

Gruß


----------

