# Problem mit XSLT (wahrscheinlich ein Bug in Java 6)



## slawaweis (25. Jan 2009)

Hallo,

habe Heute den ganzen Tag an einem Problem verzweifeln und glaube inzwischen, dass es ein Bug in Java 6 ist. Deshalb wollte ich hier zuerst um eine Bestätigung fragen, bevor ich die Sache an SUN sende. Vielleicht ist das Problem ja schon bekannt und es gibt einen Workaround, oder ich mache was falsch 

Ich versuche ein eigenes XML-Format per XSL in eine TXT-Datei umzuwandeln. Dabei kommen mit Java 4, 5, und 6 verschiedene Ergebnisse raus.

Hier eine Beispiel XML-Datei, die nur einen Tag hat, der zweimal vorkommt und jeweils 10 Attribute hat, einmal mit "%" und einmal ohne:

*abc.xml*

```
<?xml version="1.0" ?>

<?xml-stylesheet href="abc.xsl" type="text/xsl"?>

<document>

  <abc a1="10" a2="20" a3="30" a4="40"
       a5="50" a6="60" a7="70" a8="80"
       a9="90" a10="100"
       />
  
  <abc a1="10%" a2="20%" a3="30%" a4="40%"
       a5="50%" a6="60%" a7="70%" a8="80%"
       a9="90%" a10="100%"
       />

</document>
```

Hier eine Beispiel XSL-Datei, die diesen einen Tag von oben verarbeitet und dabei die Werte der Attribute einfach auflistet:

*abc.xsl*

```
<?xml version="1.0" ?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                >

  <xsl:output method="text" />

  <xsl:template match="abc">
    <xsl:value-of select="@a1" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a2" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a3" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a4" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a5" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a6" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a7" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a8" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a9" /><xsl:text> | </xsl:text>
    <xsl:value-of select="@a10" /><xsl:text> | </xsl:text>
  </xsl:template>

</xsl:stylesheet>
```

Jetzt versuche ich das ganze zu transformieren und habe folgende Ergebnisse:

*für j2re1.4.2_18 und jre1.5.0_16, beide mit Eclipse 3.3 und Ant ausgeführt, sowie Firefox 3.0.5*

```
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 
  
  10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% |
```

was soweit das ist, was ich will. Jetzt führe ich das ganze auf Java 6 (mit Eclipse und Ant) aus und bekomme das:

*für jre1.6.0_11, mit Eclipse 3.3 und Ant ausgeführt*

```
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 
  
  10% | 20% | 30% | 40% | 50% | 60% | 80% | 80% | 100 | 100% |
```

man beachte die letzten 4 Zahlen in der unteren Reihe.

Kann das bitte jemand überprüfen? Für alle Tests habe ich die selbe Eclipse Installation verwendet. Ant verwendet seit Java 4 den in die JVM eingebauten XSLT-Prozessor. Der Ant-Task war:


```
<target name="abc">

    <xslt in="abc.xml"
          out="abc.txt"
          style="abc.xsl"
          force="true">
    </xslt>

  </target>
```

Slawa


----------



## mvitz (25. Jan 2009)

Output in Datei abc.txt

```
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 
  10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% |
```

Sowohl:
  Ubuntu 8.04.1 mit JDK 1.6.0.07 und Ant 1.7.0
  WinXP SP3 mit JDK 1.6.0.11 und Ant 1.7.1
ergaben obiges.


----------



## slawaweis (27. Jan 2009)

Hallo habi55,



			
				habi55 hat gesagt.:
			
		

> Sowohl:
> Ubuntu 8.04.1 mit JDK 1.6.0.07 und Ant 1.7.0
> WinXP SP3 mit JDK 1.6.0.11 und Ant 1.7.1
> ergaben obiges.



danke für deinen Test. Ich habe es jetzt auch auf puren Ant 1.7.0 und 1.7.1 ausprobiert und da läuft alles korrekt durch. Dann habe ich Java 6 Update 11 und Eclipse 3.4.1 frisch installiert und es dort mit Ant ausprobiert, mit dem gleichen Effekt, dass mit Java 6 Update 11 die Ausgabe nicht stimmt. Kann das bitte jemand überprüfen? Ich teste übrigens auf Windows XP SP2.

Slawa


----------



## xweber (27. Jan 2009)

```
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 
		        
			  10% | 20% | 30% | 40% | 50% | 60% | 80% | 80% | 100 | 100% |
```

mit


```
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)
```


----------



## mvitz (28. Jan 2009)

```
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 
	10% | 20% | 30% | 40% | 50% | 60% | 80% | 80% | 100 | 100% |
```

Mit Eclipse 3.4.1 (neu runtergeladen und installiert) auf JDK 1.6.0.11

Scheint also ein Eclipseproblem zu sein.


----------



## Ebenius (28. Jan 2009)

Da Eclipse ja keine eigene JRE mitbringt, wohl aber einen eigenen Compiler: Passiert das selbe, wenn man die kompilierten Klassen aus den Eclipse-Projekten mit Java aus der Shell benutzt? Eventuell optimiert der JDT ja was kaputt?


----------



## Gelöschtes Mitglied 5909 (28. Jan 2009)

> 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
> 
> 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% |



xp sp3 java 6 u 11 ant 1.7.0

aus der Konsole aufgerufen


----------



## Ebenius (28. Jan 2009)

raiL hat gesagt.:
			
		

> xp sp3 java 6 u 11 ant 1.7.0


Mit Sun javac? Kannst ja mit dem selben Setup mal den JDT probieren. Das konnte man doch beim compile-task im Ant angeben, oder?


----------



## mvitz (28. Jan 2009)

also bei mir Ant 1.7.1 und JDK 1.6.0.11 ging es auf der Console unter Win XP SP3. Mit Eclipse 3.4.1 auf derselber Maschine ging es nicht. Deswegen denke ich mal liegt es an Eclipse.


----------



## Ebenius (28. Jan 2009)

habi55 hat gesagt.:
			
		

> also bei mir Ant 1.7.1 und JDK 1.6.0.11 ging es auf der Console unter Win XP SP3. Mit Eclipse 3.4.1 auf derselber Maschine ging es nicht. Deswegen denke ich mal liegt es an Eclipse.


... in dem ja der JDT-Compiler verwendet wird. Ich würde das testen, bevor ich einen Bug-Report schreibe.


----------



## mvitz (28. Jan 2009)

Was hat denn der Compiler mit einer XSLT Transformation zu tun? (Ich habe davon keine Ahnung)


----------



## Ebenius (28. Jan 2009)

habi55 hat gesagt.:
			
		

> Was hat denn der Compiler mit einer XSLT Transformation zu tun? (Ich habe davon keine Ahnung)


Mit der Transformation hoffentlich gar nix. Aber vielleicht mit dem Code drumherum... Irgendwer gibt das doch aus... In einem Java-Programm, oder? Wenn der Compiler da Mist macht, kann das die seltsamsten Effekte hervorrufen. Und JDT optimiert eben extrem anders als Sun-Javac. Daher würde ich das einfach prüfen, ohne genauen Anlass.


----------



## mvitz (28. Jan 2009)

Output ist ne .txt Datei


----------



## Ebenius (28. Jan 2009)

Ohje. ich hab gedacht, Du rufst nen XSLT-Processor aus Java heraus auf. Aber das passiert ja direkt im ANT. Wer lesen kann... Sorry.


----------



## Gelöschtes Mitglied 5909 (28. Jan 2009)

dann wirds wohl an der ant version liegen die eclipse verwendet


----------



## Ebenius (28. Jan 2009)

raiL hat gesagt.:
			
		

> dann wirds wohl an der ant version liegen die eclipse verwendet


Kannst ja mit dem classpath-Parameter und dem factory-Parameter im xslt-Task rumspielen. Vielleicht hilft das.


----------



## slawaweis (1. Feb 2009)

danke an alle die es getestet haben. Es ist ein reines Eclipse und Ant-Integration Problem. Ohne Eclipse läuft alles richtig durch. Ich habe einen Workaround gefunden, das das Problem zwar nicht löst, aber umgeht. Dazu muss man sich Xalan runterladen und die vier JAR-Bibliotheken aus Xalan in den Build-Path des Ant-Aufrufts in Eclipse setzen. Dann läuft es ohne Probleme auch auf Java 6 durch. Man kann auch noch expliziert den Transformer in dem Ant-Task angeben:


```
<target name="abc">

    <xslt in="abc.xml"
          out="abc.txt"
          style="abc.xsl"
          force="true">
      <factory name="org.apache.xalan.processor.TransformerFactoryImpl" />
    </xslt>

  </target>
```

um es zu untermauern, aber es geht auch ohne. Ant wählt wohl selber den Xalan-Prozessor aus, wenn der im Classpath verfügbar ist.

Slawa


----------

