Been spending too much time on this.."f$%" Hope you can share of your experience. I have the source flat XML arriving from external db in the following structure:
<?xml version="1.0" encoding="utf-8"?>
<ns:MT_ActualCosts xmlns:ns="http://percite:scmaster/actual_costs">
<row>
<EVENT_ID>106</EVENT_ID>
<LINE_NUMBER>0</LINE_NUMBER>
<INVOICE_NUMBER>9999</INVOICE_NUMBER>
<INVOICE_DATE>2015-02-09 00:00:00.0</INVOICE_DATE>
<CURRENCY_CODE>USD</CURRENCY_CODE>
<TOTAL_AMOUNT_NET>0001</TOTAL_AMOUNT_NET>
<RO_NUMBER>102808</RO_NUMBER>
</row>
<row>
<EVENT_ID>106</EVENT_ID>
<LINE_NUMBER>1</LINE_NUMBER>
<INVOICE_NUMBER>24444</INVOICE_NUMBER>
<PLANT>0003</PLANT>
<ALLOCATION_AMOUNT>122</ALLOCATION_AMOUNT>
</row>
<row>
<EVENT_ID>109</EVENT_ID>
<LINE_NUMBER>0</LINE_NUMBER>
<INVOICE_NUMBER>24458</INVOICE_NUMBER>
<INVOICE_DATE>2015-02-09 00:00:00.0</INVOICE_DATE>
<CURRENCY_CODE>USD</CURRENCY_CODE>
<TOTAL_AMOUNT_NET>0011</TOTAL_AMOUNT_NET>
<RO_NUMBER>102813</RO_NUMBER>
</row>
<row>
<EVENT_ID>109</EVENT_ID>
<LINE_NUMBER>1</LINE_NUMBER>
<INVOICE_NUMBER>24458</INVOICE_NUMBER>
<PLANT>0003</PLANT>
<ALLOCATION_AMOUNT>11.1</ALLOCATION_AMOUNT>
</row>
<row>
<EVENT_ID>108</EVENT_ID>
<LINE_NUMBER>0</LINE_NUMBER>
<INVOICE_NUMBER>24535</INVOICE_NUMBER>
<INVOICE_DATE>2015-02-19 00:00:00.0</INVOICE_DATE>
<CURRENCY_CODE>USD</CURRENCY_CODE>
<TOTAL_AMOUNT_NET>11</TOTAL_AMOUNT_NET>
<RO_NUMBER>102811</RO_NUMBER>
</row>
<row>
<EVENT_ID>108</EVENT_ID>
<LINE_NUMBER>1</LINE_NUMBER>
<INVOICE_NUMBER>24535</INVOICE_NUMBER>
<PLANT>0002</PLANT>
<ALLOCATION_AMOUNT>11</ALLOCATION_AMOUNT>
</row>
<row>
<EVENT_ID>171</EVENT_ID>
<LINE_NUMBER>0</LINE_NUMBER>
<INVOICE_NUMBER>24645</INVOICE_NUMBER>
<INVOICE_DATE>2015-02-28 00:00:00.0</INVOICE_DATE>
<CURRENCY_CODE>USD</CURRENCY_CODE>
<TOTAL_AMOUNT_NET>999999</TOTAL_AMOUNT_NET>
<RO_NUMBER>103063</RO_NUMBER>
</row>
<row>
<EVENT_ID>171</EVENT_ID>
<LINE_NUMBER>1</LINE_NUMBER>
<INVOICE_NUMBER>24645</INVOICE_NUMBER>
<PLANT>0001</PLANT>
<ALLOCATION_AMOUNT>11.47</ALLOCATION_AMOUNT>
</row>
<row>
<EVENT_ID>171</EVENT_ID>
<LINE_NUMBER>2</LINE_NUMBER>
<INVOICE_NUMBER>24645</INVOICE_NUMBER>
<PLANT>0001</PLANT>
<ALLOCATION_AMOUNT>11.53</ALLOCATION_AMOUNT>
</row>
</ns:MT_ActualCosts>
My requested Target Structure should be something like this:
[![enter image description here][1]][1]
I need to group under the Header segments RecordLine Segments of the same `EVENT_ID`.
Currently my XSLT can't create the needed structure.
this is my XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://percite:scmaster/actual_costs">
<xsl:output method="xml" indent="yes"/>
<!-- xsi:noNamespaceSchemaLocation="\\palnt03\palramnet-redirect$\IL-Users\My-Documents\nimrod_g\SAP\Projects\ScMaster\Finance\ActualCosts\development\xsd"> -->
<xsl:template match="/">
<ns0:MT_ActualCostPreNormalized>
<xsl:for-each select= "ns0:MT_ActualCosts/row">
<xsl:if test="LINE_NUMBER=0">
<Header>
<EVENT_ID><xsl:value-of select="EVENT_ID"></xsl:value-of>
</EVENT_ID>
<LINE_NUMBER>
<xsl:value-of select="LINE_NUMBER"/>
</LINE_NUMBER>
<INVOICE_NUMBER>
<xsl:value-of select="INVOICE_NUMBER"/>
</INVOICE_NUMBER>
<CURRENCY_CODE>
<xsl:value-of select="CURRENCY_CODE"/>
</CURRENCY_CODE>
<TOTAL_AMOUNT_NET>
<xsl:value-of select="TOTAL_AMOUNT_NET"/>
</TOTAL_AMOUNT_NET>
<RO_NUMBER>
<xsl:value-of select="RO_NUMBER"/>
</RO_NUMBER>
<PLANT>
<xsl:value-of select="PLANT"/>
</PLANT>
<ALLOCATION_AMOUNT>
<xsl:value-of select="ALLOCATION_AMOUNT"/>
</ALLOCATION_AMOUNT>
</Header>
</xsl:if>
<xsl:if test="LINE_NUMBER!=0">
<RecordLine>
<EVENT_ID><xsl:value-of select="EVENT_ID"></xsl:value-of>
</EVENT_ID>
<LINE_NUMBER>
<xsl:value-of select="LINE_NUMBER"/>
</LINE_NUMBER>
<INVOICE_NUMBER>
<xsl:value-of select="INVOICE_NUMBER"/>
</INVOICE_NUMBER>
<CURRENCY_CODE>
<xsl:value-of select="CURRENCY_CODE"/>
</CURRENCY_CODE>
<TOTAL_AMOUNT_NET>
<xsl:value-of select="TOTAL_AMOUNT_NET"/>
</TOTAL_AMOUNT_NET>
<RO_NUMBER>
<xsl:value-of select="RO_NUMBER"/>
</RO_NUMBER>
<PLANT>
<xsl:value-of select="PLANT"/>
</PLANT>
<ALLOCATION_AMOUNT>
<xsl:value-of select="ALLOCATION_AMOUNT"/>
</ALLOCATION_AMOUNT>
</RecordLine>
</xsl:if>
</xsl:for-each>
</ns0:MT_ActualCostPreNormalized>
</xsl:template>
</xsl:stylesheet>
[1]: https://i.sstatic.net/yklFq.jpg
After implemenitng most of the code provided by Daniel Haley it seems like the solution is very near. Follwoing Martin's request I am adding here the current XSLT used+the current result XML. I will try and clerify my rules for the XSLT program: 1.Each record from the source XML should be analyzed as followed: if LINE_NUMBER = 0 then this is a header record and should produce a segment**.(it shouldnt be added to the segment )** - if LINE_NUMBER is > 0 and its EVENT_ID equals to the row produced the segment the this is a RecordLine in the context of the same segment and should open a segment under the same ." Few problems can be seen in the result xml:
- The first 4 groups of Headers-RecordLines comes out nicley (EventIDs 100 to 104) .but on EVENT_ID 105 something went wrong. it can be see that the row with LINE_NUMBER=0 created a Header segment but also added the data twice inside a record line. this is wrong result.
- from this point on, all the records are getting messed up. Currently I can't say why this happened. I have added part of the source XML (as image) as comming from our testing db. I have added part of the result XML (as image)Hope these notes will clearify the issue.