oli-87
Goto Top

XSL-Transformation-Problem (XRTreeFrag cannot be cast to)

Hallo und einen schönen guten Abend,

ich hänge hier gerade an einer Anforderung und komme absolut nicht weiter. Ich versuche mit XSL 1.0 (FOP-Prozessor) eine Liste von Positionen zu errechnen, leider bekomme ich folgende Fehlermeldung:

javax.xml.transform.TransformerException: org.apache.xpath.objects.XRTreeFrag cannot be cast to org.apache.xpath.objects.XNodeSet

Ich habe folgendes XML (Auszug):
<root>
<Ebene1>
<Ebene2>
<Position netPrice="1000" percent="2"/>
<Position netPrice="2000" percent="4"/>
<Position netPrice="3000" percent="2"/>
<Position netPrice="6000" percent="1"/>
<Position netPrice="2000" percent="2"/>
</Ebene2>
</Ebene1>
</root>

Das wirkliche XML und die Rechnung sehen ein wenig komplizierter aus, aber ich habe die Transformation ein wenig vereinfacht. Der Fehler besteht weiterhin. Hier der XSL-Auszug, der den Fehler verursacht:

<xsl:variable name="liste">
<xsl:for-each select="root/Ebene1/Ebene2" >
<xsl:variable name="temp" select="((@netPrice * @percent) div 100)" />
<xs:element type="xs:integer"><xsl:value-of select="$temp" /></xs:element>
</xsl:for-each>
</xsl:variable>

<xsl:variable name="all" >
<xsl:value-of select="sum($liste/*)" />
</xsl:variable>


Normalerweise würde ich erwarten, dass das Ergebnis 260 ist, da er jede Zeile einzeln addiert und zum Schluss die Summe bildet.

1000 x 2 / 100 = 20
2000 x 4 / 100 = 80
3000 x 2 / 100 = 60
6000 x 1 / 100 = 60
2000 x 2 / 100 = 40

Summe = 260

Ich könnte das Ergebnis auch so berechnen:

0,1x(A1xB1+A2xB2+A3xB3+A4xB4+A5xB5)

Aber leider ändert sich das XML jedes mal, sodass ich die Anzahl der Reihen noch nicht kenne.

Ich wäre über jeden Lösungsansatz dankbar.

Lieben Gruß und vielen Dank
Oli

Content-Key: 280465

Url: https://administrator.de/contentid/280465

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: 114757
114757 18.08.2015 aktualisiert um 12:44:57 Uhr
Goto Top
Moin,
XSLT 2.0
<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
			<xsl:template match="/root/Ebene1/Ebene2">  
			<root>
				<xsl:for-each select="Position">  
						<wert>
							<xsl:value-of select="((@netPrice * @percent) div 100)"/>								  
						</wert>
				</xsl:for-each>
				<total>
					<xsl:value-of select="sum(for $i in Position return ($i/@netPrice * $i/@percent) div 100)"/>  
				</total>
			</root>
		</xsl:template>
</xsl:stylesheet>
Gruß jodel32