xslt - Sum the amount by checking more than 2 values in a record -
source xml:
<?xml version="1.0" encoding="utf-8"?> <emp> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj1</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem1</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>1</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>100.00</value> </amount> </amountdetails> </empdetail> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj1</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem1</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>1</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>5000</value> </amount> </amountdetails> </empdetail> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj2</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem2</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>2</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>200.00</value> </amount> </amountdetails> </empdetail> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj2</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem2</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>3</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>500</value> </amount> </amountdetails> </empdetail> </emp> target xml:
<?xml version="1.0" encoding="utf-8"?> <emp> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj1</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem1</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>1</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>5100.00</value> </amount> </amountdetails> </empdetail> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj2</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem2</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>2</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>200.00</value> </amount> </amountdetails> </empdetail> <empdetail> <projectdetails> <code>project</code> <projectreference> <reference> <refcode>proj2</refcode> </reference> </projectreference> </projectdetails> <projectdetails> <code>element</code> <projectreference> <reference> <refcode>elem2</refcode> </reference> </projectreference> </projectdetails> <period> <periodno>3</periodno> </period> <amountdetails> <currency>eur</currency> <amount> <value>500</value> </amount> </amountdetails> </empdetail> </emp> query: if periodno, project's refcode , element's refcode same have sum amount value , should generate 1 record. in source file, first 2 line item's periodno, project's refcode , element's refcode same, 1 record in output , amount value should (100+5000) = 5100.
i have thought if have check 1 value , sum of lineitem, in case have check 3 values in each record , have sum it. please tell me, how proceed using xslt. have xslt 1.0 version.
i not know if find solution @ point, because there no solution posted here posting mine based in muenchian grouping.
i have tried explain code using comments, hope helps.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" indent="yes"/> <!-- re-create default attributes, elements , text --> <xsl:template match="*|@*"> <xsl:copy><xsl:apply-templates select="node()|@*" /></xsl:copy> </xsl:template> <!-- key going allow identify each empdetail next id (which string): projectrefcode-elementrefcode-periodno using key function going able select set of empdetail nodes have described structure. elements same id (i.e. same projectrefcode, elementrefcode , periodno) going matched using: key('detail-key', $id), $id holds id matched. --> <xsl:key name="detail-key" match="emp/empdetail" use="concat(projectdetails[code = 'project']/projectreference/reference/refcode, '-', projectdetails[code = 'element']/projectreference/reference/refcode, '-', period/periodno)" /> <xsl:template match="emp"> <!-- re-create current node , process children empdetail elements --> <xsl:copy> <!-- utilize key('detail-key', $id)[1] $id concat look select 1 element per group, i.e. iterate on set of unique empdetail elements --> <xsl:apply-templates select="empdetail[generate-id(.) = generate-id(key('detail-key', concat(projectdetails[code = 'project']/projectreference/reference/refcode, '-', projectdetails[code = 'element']/projectreference/reference/refcode, '-', period/periodno))[1])]" /> </xsl:copy> </xsl:template> <!-- when value element found, perform sum of value elements contained in grouping matched id described above--> <xsl:template match="value"> <!-- cache parent node avoid repeated operations --> <xsl:variable name="current-detail" select="../../.." /> <!-- generate id current empdetail element described above --> <xsl:variable name="detail-id" select="concat($current-detail/projectdetails[code = 'project']/projectreference/reference/refcode, '-', $current-detail/projectdetails[code = 'element']/projectreference/reference/refcode, '-', $current-detail/period/periodno)" /> <!-- wrap sum value element --> <xsl:copy> <!-- utilize key function fetch empdetail elements same id current 1 , sum them --> <xsl:value-of select="sum(key('detail-key', $detail-id)/amountdetails/amount/value)" /> </xsl:copy> </xsl:template> </xsl:stylesheet> xslt xslt-1.0
No comments:
Post a Comment