Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Edit: Updated my XSLT to accommodate OP's request to insert totals into the original XML. The trick to solving the problem is to use the identity template and a global variable.</p> <p>If you use this XSLT:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:key name="KType" match="Basisproduct" use="."/&gt; &lt;xsl:output indent="yes"/&gt; &lt;xsl:strip-space elements="*"/&gt; &lt;!-- create a variable w/ the calculated totals --&gt; &lt;xsl:variable name="CalculatedTotals"&gt; &lt;xsl:for-each select="*/*/*/Basisproduct [generate-id() = generate-id(key ('KType', .)[1])]"&gt; &lt;xsl:element name="TotalProduct"&gt; &lt;xsl:element name="Basisproduct"&gt; &lt;xsl:value-of select= "."/&gt; &lt;/xsl:element&gt; &lt;xsl:element name="Cumul_Amount"&gt; &lt;xsl:value-of select= "/*/*/*[Basisproduct = current()][last()]/CustInvoice_LineAmount + sum(/*/*/*[Basisproduct = current()][last()]/preceding-sibling::*/CustInvoice_LineAmount)"/&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:variable&gt; &lt;!-- identity --&gt; &lt;xsl:template match="node()|@*"&gt; &lt;xsl:copy&gt; &lt;xsl:apply-templates select="node()|@*"/&gt; &lt;/xsl:copy&gt; &lt;/xsl:template&gt; &lt;!-- root --&gt; &lt;xsl:template match="/"&gt; &lt;xsl:apply-templates select="node()|@*"/&gt; &lt;/xsl:template&gt; &lt;xsl:template match="Totals"&gt; &lt;xsl:copy&gt; &lt;!-- insert the calculated totals --&gt; &lt;xsl:copy-of select="$CalculatedTotals"/&gt; &lt;/xsl:copy&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt; </code></pre> <p>You will get this XML output:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;Report Name="SalesInvoice"&gt; &lt;ReportName&gt;SalesInvoice&lt;/ReportName&gt; &lt;Invoice&gt; &lt;InvoicingName&gt;Test Company&lt;/InvoicingName&gt; &lt;/Invoice&gt; &lt;ConditionalArea&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;110&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;1.52&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;198&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;20.11&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;198&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;20.22&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;992&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;30.33&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;993&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;30.34&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;992&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;30.35&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;992&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;30.45&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;993&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;30.46&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;BodyCustInvoice&gt; &lt;Basisproduct&gt;198&lt;/Basisproduct&gt; &lt;CustInvoice_LineAmount&gt;100.99&lt;/CustInvoice_LineAmount&gt; &lt;/BodyCustInvoice&gt; &lt;/ConditionalArea&gt; &lt;Totals&gt; &lt;TotalProduct&gt; &lt;Basisproduct&gt;110&lt;/Basisproduct&gt; &lt;Cumul_Amount&gt;1.52&lt;/Cumul_Amount&gt; &lt;/TotalProduct&gt; &lt;TotalProduct&gt; &lt;Basisproduct&gt;198&lt;/Basisproduct&gt; &lt;Cumul_Amount&gt;294.77&lt;/Cumul_Amount&gt; &lt;/TotalProduct&gt; &lt;TotalProduct&gt; &lt;Basisproduct&gt;992&lt;/Basisproduct&gt; &lt;Cumul_Amount&gt;163.32&lt;/Cumul_Amount&gt; &lt;/TotalProduct&gt; &lt;TotalProduct&gt; &lt;Basisproduct&gt;993&lt;/Basisproduct&gt; &lt;Cumul_Amount&gt;193.78000000000003&lt;/Cumul_Amount&gt; &lt;/TotalProduct&gt; &lt;/Totals&gt; &lt;/Report&gt; </code></pre> <p>Tested with Oxygen 12 on Win 7.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload