Hier ist eine Lösung XSLT2 verwendet wird, in dem Knotenmengen First-Class-Objekte sind. In XSLT1 müssen Sie eine Knotensatzerweiterung verwenden.
Erklärung unten:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="extendedItems" as="xs:integer*">
<xsl:for-each select="//Item">
<xsl:value-of select="./Price * ./Quantity"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="total">
<xsl:value-of select="sum($extendedItems)"/>
</xsl:variable>
<xsl:template match="//QuantityTotal">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$total"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Der hier Ansatz ist es, eine „Identität Transformation“ zu verwenden, um das Dokument zu kopieren, während der Berechnungen und das Ergebnis in die Ausgabe QuantityTotal Vorlage eingefügt wird. Die erste Vorlage kopiert die Eingabe in die Ausgabe, wird jedoch am Ende von einer spezifischeren Vorlage für "MengeTotal" überschrieben. Die erste Variablendeklaration erstellt eine Liste erweiterter Kosten und die zweite Variablendefinition summiert die Kosten, um die Summe zu erzeugen. Die Summe wird dann in den NumberTotal-Knoten eingefügt.
Der Schlüssel zum Verständnis von XSL ist, dass es deklarativer Natur ist. Der häufigste konzeptionelle Fehler, der von fast allen Anfängern gemacht wird, ist anzunehmen, dass das Stylesheet ein sequenzielles Programm ist, das das Eingabe-XML-Dokument verarbeitet. In Wirklichkeit ist es umgekehrt. Die XSL-Engine liest das XML-Dokument. und für jedes neue Tag, auf das es trifft, sucht es im Stylesheet nach der "besten" Übereinstimmung und führt diese Vorlage aus.
EDIT:
Hier ist eine xslt1.1 Version, die mit Saxon 6,5
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ex="http://exslt.org/common"
extension-element-prefixes="ex"
version="1.1">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="extendedItems">
<xsl:for-each select="//Item">
<extended>
<xsl:value-of select="./Price * ./Quantity"/>
</extended>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="total">
<xsl:value-of select="sum(ex:node-set($extendedItems/extended))"/>
</xsl:variable>
<xsl:template match="//QuantityTotal">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$total"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
+1 gute Frage –
Gute Frage (+1). Siehe meine Antwort für Lösungen in XSLT 1.0 (keine Erweiterungen erforderlich) und XSLT 2.0 –
Siehe auch http://StackOverflow.com/questions/436998/multiply-2-numbers-and-then-sum-with-xslt und http ://Paketüberfluss.com/questions/1333558/xslt-to-sum-produkt-von-zwei-attribute – harpo