XML : Converting Flat XML to grouped/Hierarchical XML using XSLT 1.0

Thanks to some stackoverflow experts I was able to convert an XML with flat data to a grouped text document. However have been told that the output has to be in hierarchical XML itself. I am absolutely lost now.

Below is the grouped output (text). I am unaware how it will look in XML format, but the idea is to provide end user with a readable report but my system requires input as hierarchy.

  Client Sum Insured Report    UK  SNo.    Policy Number   Customer Name   Cover Note #    No. of Addendas Sum Insured Total Commission   1       POL1           ABC             50242           2               40000       65   2       POL2           XYZ             12345           1               30000       30  Totals :                                                                70000       95    US  SNo.    Policy Number   Customer Name   Cover Note #    No. of Addendas Sum Insured Total Commission   1                      JKL             45678           0               10000       10  Totals :                                                                10000       10    

Input XML:

  <?xml version="1.0" encoding="UTF-8"?><?Siebel-Property-Set EscapeNames="true"?><SiebelMessage MessageId="1-OC05" IntObjectName="Client Sum Insured Report IO" MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical">  <ListOfClientSumInsuredReportIo>  <GroupPolicies>   <Addenda>50242-1</Addenda>   <CommAmt>50</CommAmt>   <Cover>50242</Cover>   <Customer>ABC</Customer>   <Policy>POL1</Policy>   <SumInsured>10000</SumInsured>   <Organization>UK</Organization>  </GroupPolicies>  <GroupPolicies>   <Addenda>50242-2</Addenda>   <CommAmt>5</CommAmt>   <Cover>50242</Cover>   <Customer>ABC</Customer>   <Policy>POL1</Policy>   <SumInsured>20000</SumInsured>   <Organization>UK</Organization>  </GroupPolicies>  <GroupPolicies>   <Addenda></Addenda>   <CommAmt>10</CommAmt>   <Cover>50242</Cover>   <Customer>ABC</Customer>   <Policy>POL1</Policy>   <SumInsured>10000</SumInsured>   <Organization>UK</Organization>  </GroupPolicies>  <GroupPolicies>   <Addenda>12345-1</Addenda>   <CommAmt>20</CommAmt>   <Cover>12345</Cover>   <Customer>XYZ</Customer>   <Policy>POL2</Policy>   <SumInsured>20000</SumInsured>   <Organization>UK</Organization>  </GroupPolicies>  <GroupPolicies>   <Addenda></Addenda>   <CommAmt>10</CommAmt>   <Cover>12345</Cover>   <Customer>XYZ</Customer>   <Policy>POL2</Policy>   <SumInsured>10000</SumInsured>   <Organization>UK</Organization>  </GroupPolicies>  <GroupPolicies>   <Addenda></Addenda>   <CommAmt>10</CommAmt>   <Cover>45678</Cover>   <Customer>JKL</Customer>   <Policy></Policy>   <SumInsured>10000</SumInsured>   <Organization>US</Organization>  </GroupPolicies>  </ListOfClientSumInsuredReportIo>    

Existing XSLT:

  <?xml version="1.0" encoding="utf-8"?>     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   <xsl:output method="text" indent="yes"/>          <xsl:template match="/SiebelMessage/ListOfClientSumInsuredReportIo">    <xsl:text>&#09;&#09;</xsl:text>    <xsl:text>Client Sum Insured Report</xsl:text>    <xsl:text>&#10;</xsl:text>      <xsl:apply-templates select="GroupPolicies[not(preceding-sibling::GroupPolicies/Organization = Organization)]/Organization"/>    </xsl:template>    <xsl:template match="GroupPolicies">      <xsl:variable name="count" select="position()"/>      <xsl:value-of select="$count"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="Policy"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="Customer"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="Cover"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="count(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/Addenda[string-length()>0])"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/SumInsured)"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/CommAmt)"/>       <xsl:text>&#10;</xsl:text>                </xsl:template>      <xsl:template match="Organization">      <xsl:text>&#10;</xsl:text>      <xsl:text>SNo.</xsl:text>      <xsl:text>&#09;</xsl:text>      <xsl:text>Policy Number</xsl:text>      <xsl:text>&#09;</xsl:text>      <xsl:text>Customer Name</xsl:text>      <xsl:text>&#09;</xsl:text>      <xsl:text>Cover Note #</xsl:text>      <xsl:text>&#09;</xsl:text>      <xsl:text>No. of Addendas</xsl:text>      <xsl:text>&#09;</xsl:text>      <xsl:text>Sum Insured</xsl:text>      <xsl:text>&#09;</xsl:text>      <xsl:text>Total Commission</xsl:text>      <xsl:text>&#10;</xsl:text>   <xsl:variable name="temp" select="." />            <xsl:apply-templates select="//GroupPolicies[Organization = current() and not(preceding-sibling::GroupPolicies/Cover=Cover)]"/>      <xsl:text>Totals:</xsl:text>      <xsl:text>&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;</xsl:text><xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/SumInsured)"/>      <xsl:text>&#09;</xsl:text>      <xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/CommAmt)"/>   </xsl:template>     </xsl:stylesheet>    

Any help would be great.

No comments:

Post a Comment