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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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...