Zum Inhalt springen
  • 0

XSLT / XPath: Summe von mehrerer Berechneten Schleifen Werten bilden


Frage

Geschrieben

Hey Leute, 

und noch eine Frage von mir :D Gestern hatte ich ja folgende Frage gepostet:

Das Problem konnte glücklicherweise gelöst werden, nur bin ich jetzt auf ein anderes Problem gestoßen, sämtliche Variablen die ich im <xsl:for-each> definiert habe, sind ja nur in diesem Kontext verfügbar, sobald ich die Schleife verlasse, sind die Variablen auch nichtig. Das war etwas das ich leider komplett vergessen hatte bei XSLT und was es ja von "normalen" Programmiersprachen unterscheidet.

Das Problem dabei ist, ich brauche einige Berechnungsergebnisse aus Variablen in der Schleife um einen Gesamtwert zu den Berechneten Werten pro ID zu ermitteln. Die Ergebnisse in der Schleife muss ich natürlich auch erstmal "speichern" da diese ja immer überschrieben werden bei einer neuen iteration, wenn ich das richtig verstanden habe.

Um das Szenario von der letzten Frage aufzugreifen:

<root>
  <elemente>
    <element>
    	<id>1</id>
      	<initalwert>10</initalwert>
    </element>
    <element>
    	<id>2</id>
      	<initalwert>5</initalwert>
    </element>
  </elemente>
  <testfälle>
    <testfall>
      <tid>1</tid>
      <beschreibung>hshgoasn</beschreibung>
      <multiplikator>20</multiplikator>
    </testfall>
    <testfall>
      <tid>2</tid>
      <beschreibung>dhfoashgfon</beschreibung>
      <multiplikator>40</multiplikator>
    </testfall>
  </testfälle>
  <extra>
    <prozentwert>20</prozentwert>
  </extra>  
</root>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  <xsl:output method="text"/>
  
	<xsl:template match="/">
		<xsl:for-each select="./root/elemente/element">
			<xsl:variable name="elemtId" select="./id" />
          	<xsl:variable name="berechnung" select="./initalwert * //testfälle/testfall[./tid=$elemtId]/multiplikator"/>
          	<xsl:variable name="prozentwert" select="/root/extra/prozentwert/ * ./initalwert div 100"/>
			ID: <xsl:value-of select="./id"/>
			Beschreibung: <xsl:value-of select="//testfälle/testfall[./tid=$elemtId]/beschreibung"/>
          	Berechnung: <xsl:value-of select="$berechnung + $prozentwert"/>
		</xsl:for-each>
      Gesamtwert: <!-- Hier müsste der Gesamtwert aus den Berechnungen von ID 1 & 2 rein -->
	</xsl:template>
  
</xsl:stylesheet>

Ich hab jetzt verschiedene Sachen probiert, aber mein Problem ist das ich die Werte aus den iterationen nicht gespeichert und dann global verwendbar bekomme um daraus den Gesamtwert zu ermitteln.

2 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben

Ich denke das geht so nicht wie du dir das vorstellst. XSLT ist keine Programmiersprache, die Variablen werden zur Transformation ausgewertet und bleiben dann so.

Was du machen kannst:
Du transformierst dein original XML mit XSLT in ein neues XML das zu jedem Element schon den berechneten Wert enthält.
Dieses XML benutzt du dann für die eigentliche Ausgabe und kannst für den Gesamtwert sowas machen

Zitat

<xsl:value-of select="sum(/root/elemente/element/berechnung)" />

nicht hübsch aber das einzige was mir einfällt abgesehen von einem kleinen(?) Programm mit dem du das ganze direkt mit XPATH und etwas Programmlogik von Hand zusammenbastelst.

  • 0
Geschrieben
vor 9 Stunden schrieb _n4p_:

Ich denke das geht so nicht wie du dir das vorstellst. XSLT ist keine Programmiersprache, die Variablen werden zur Transformation ausgewertet und bleiben dann so.

Ja das ist mir dann auch wieder eingefallen :( Hatte gehofft das es irgendwie doch geht ? 

vor 9 Stunden schrieb _n4p_:

Was du machen kannst:
Du transformierst dein original XML mit XSLT in ein neues XML das zu jedem Element schon den berechneten Wert enthält.
Dieses XML benutzt du dann für die eigentliche Ausgabe und kannst für den Gesamtwert sowas machen

nicht hübsch aber das einzige was mir einfällt abgesehen von einem kleinen(?) Programm mit dem du das ganze direkt mit XPATH und etwas Programmlogik von Hand zusammenbastelst.

Hmm ok dann muss ich wohl mal schauen, wie ich das machen kann ? Danke dir schon mal

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...