I am new to XSL transformations and I want to transform the XML A into XML B .Any suggestions to achieve this in XSLT or xquery. I tried using for-each-group on msisdn but still unable to achieve it.Any sample code to start with
XML A:
<Output>
<response>
<msisdn>27832007509</msisdn>
<bearer>DATA</bearer>
<comb_charged_units>4223777792</comb_charged_units>
<comb_cnt>288</comb_cnt>
<shared_voice_duration>0</shared_voice_duration>
<shared_data_volume>8728127</shared_data_volume>
<shared_voice_cnt>0</shared_voice_cnt>
<shared_data_cnt>89</shared_data_cnt>
</response>
<response>
<msisdn>27832007509</msisdn>
<bearer>VOICE</bearer>
<comb_charged_units>477792</comb_charged_units>
<comb_cnt>281</comb_cnt>
<shared_voice_duration>17268127877</shared_voice_duration>
<shared_data_volume>0</shared_data_volume>
<shared_voice_cnt>87887</shared_voice_cnt>
<shared_data_cnt>0</shared_data_cnt>
</response>
<response>
<msisdn>27832229588</msisdn>
<bearer>DATA</bearer>
<comb_charged_units>11898</comb_charged_units>
<comb_cnt>33</comb_cnt>
<shared_voice_duration>0</shared_voice_duration>
<shared_data_volume>3445</shared_data_volume>
<shared_voice_cnt>0</shared_voice_cnt>
<shared_data_cnt>78</shared_data_cnt>
</response>
<response>
<msisdn>27832229588</msisdn>
<bearer>VOICE</bearer>
<comb_charged_units>45</comb_charged_units>
<comb_cnt>12</comb_cnt>
<shared_voice_duration>789</shared_voice_duration>
<shared_data_volume>0</shared_data_volume>
<shared_voice_cnt>23</shared_voice_cnt>
<shared_data_cnt>0</shared_data_cnt>
</response>
XML B:
<UsageHistoryResponse>
<usage>
<MSISDN>27832007509</MSISDN>
<CombinedUsage>
<usage_info>
<bearer>DATA</bearer>
<bearer_units>288</bearer_units>
<bearer_units_uom>Sessions</bearer_units_uom>
<bearer_usage>4223777792</bearer_usage>
<bearer_usage_uom>bytes</bearer_usage_uom>
</usage_info>
<usage_info>
<bearer>VOICE</bearer>
<bearer_units>281</bearer_units>
<bearer_units_uom>Calls</bearer_units_uom>
<bearer_usage>477792</bearer_usage>
<bearer_usage_uom>Seconds</bearer_usage_uom>
</usage_info>
</CombinedUsage>
<SharedUsage>
<usage_info>
<bearer>DATA</bearer>
<bearer_units>89</bearer_units>
<bearer_units_uom>Sessions</bearer_units_uom>
<bearer_usage>8728127</bearer_usage>
<bearer_usage_uom>bytes</bearer_usage_uom>
</usage_info>
<usage_info>
<bearer>VOICE</bearer>
<bearer_units>87887</bearer_units>
<bearer_units_uom>Calls</bearer_units_uom>
<bearer_usage>17268127877</bearer_usage>
<bearer_usage_uom>Seconds</bearer_usage_uom>
</usage_info>
</SharedUsage>
</usage>
<usage>
<MSISDN>27832229588</MSISDN>
<CombinedUsage>
<usage_info>
<bearer>DATA</bearer>
<bearer_units>33</bearer_units>
<bearer_units_uom>Sessions</bearer_units_uom>
<bearer_usage>11898</bearer_usage>
<bearer_usage_uom>bytes</bearer_usage_uom>
</usage_info>
<usage_info>
<bearer>VOICE</bearer>
<bearer_units>12</bearer_units>
<bearer_units_uom>Calls</bearer_units_uom>
<bearer_usage>45</bearer_usage>
<bearer_usage_uom>Seconds</bearer_usage_uom>
</usage_info>
</CombinedUsage>
<SharedUsage>
<usage_info>
<bearer>DATA</bearer>
<bearer_units>78</bearer_units>
<bearer_units_uom>Sessions</bearer_units_uom>
<bearer_usage>3445</bearer_usage>
<bearer_usage_uom>bytes</bearer_usage_uom>
</usage_info>
<usage_info>
<bearer>VOICE</bearer>
<bearer_units>23</bearer_units>
<bearer_units_uom>Calls</bearer_units_uom>
<bearer_usage>789</bearer_usage>
<bearer_usage_uom>Seconds</bearer_usage_uom>
</usage_info>
</SharedUsage>
</usage>
My idea is to group msisdn first and then traverse into fields of it. Below is my attempt
<xsl:template match="/">
<tns:UsageHistoryResponse>
<xsl:for-each select="/Output/response">
<tns:usage>
<xsl:for-each-group select="." group-by="ns0:msisdn">
<tns:MSISDN>
<xsl:value-of select="current-grouping-key()"/></tns:MSISDN>
</xsl:for-each-group>
</tns:usage>
</xsl:for-each>
</tns:UsageHistoryResponse>
</xsl:template>