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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 280465
Url: https://administrator.de/contentid/280465
Ausgedruckt am: 26.11.2024 um 00:11 Uhr
1 Kommentar
Moin,
XSLT 2.0
Gruß jodel32
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>