Grouping elements depending on the conditions in XSLT

Viewed 52

With the sample XML data I have, I want to ungroup the <rf> into 2 or 3 by grouping values of each <rec>

  1. recs/rec/addData/entry/key='CC'/value ;and
  2. recs/rec/addData/entry/key='Att'/value.

Thereby updating <rf id > , <CC> and <rec id> values using above concatenated values alongwith the unique number appearing at the end of the string so as to make them unique.

Also, while ungrouping , the <rec> should fall under corresponding <rf>. For first <rf id="cc_5_Att_2_FamId_5811357">, the following recId 's have their recs/rec/addData/entry/key='CC'/value ='GNV' and recs/rec/addData/entry/key='Att'/value='BenJul' -RecId_6123671, RecId_6123753, RecId_6123917, RecId_6123712, RecId_6123958, RecId_6123794, RecId_5811892, RecId_6123999, RecId_6123835, and RecId_6123876.

Therefore these rec id should be put into <rf> with newly generated id as <rf id ="GNV BenJulFamId_5811357"> and the CC vaule should be updated as <CC>GNV BenJul</CC> and each <rec> should be updated as -

<rec id="GNV BenJul_RecId_6123671
<rec id="GNV BenJul_RecId_6123753
<rec id="GNV BenJul_RecId_6123917
<rec id="GNV BenJul_RecId_6123712
<rec id="GNV BenJul_RecId_6123958
<rec id="GNV BenJul_RecId_6123794
<rec id="GNV BenJul_RecId_5811892
<rec id="GNV BenJul_RecId_6123999
<rec id="GNV BenJul_RecId_6123835
<rec id="GNV BenJul_RecId_6123876

The remaining recid's of the first <rf id="cc_5_Att_2_FamId_5811357"> have their recs/rec/addData/entry/key='CC'/value ='GNV' and recs/rec/addData/entry/key='Att'/value='NicMar'--

RecId_5811597, RecId_5811869, RecId_5811520, RecId_5811950, RecId_5812102, RecId_5811730, RecId_5812078,

These rec id's should be put into <rf> with newly generated id as <rf id ="GNV NicMarFamId_5811357"> and the CC vaule should be updated as <CC>GNV NicMar</CC> and each <rec> should should be updated as

<rec id="GNV NicMar_RecId_5811597
<rec id="GNV NicMar_RecId_5811869
<rec id="GNV NicMar_RecId_5811520
<rec id="GNV NicMar_RecId_5811950
<rec id="GNV NicMar_RecId_5812102
<rec id="GNV NicMar_RecId_5811730
<rec id="GNV NicMar_RecId_5812078

My Sample XML is -

<rfs>
    <rf id="cc_5_Att_2_FamId_5811357">
    <CC>cc_5_Att_2</CC>
    <name>siRNA Knock Out assay method and constructs</name>
    <ref>GAL-011</ref>
    <recs>
        <rec id="cc_5_Att_2_RecId_6123671">
        <addData>
            <entry>
                <key>CS</key>
                <value>G</value>
            </entry>
            <entry>
                <key>IP</key>
                <value>L</value>
            </entry>
            <entry>
                <key>Div</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>CC</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>Att</key>
                <value>BenJul</value>
            </entry>
            <entry>
                <key>O</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>App</key>
                <value>GNV</value>
            </entry>
        </addData>
        <type>VP</type>
        <cFiled>AT</cFiled>
        <ref>GAL-011-AT-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5811597">
        <addData>
        <entry>
        <key>CS</key>
        <value>Ed</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>Leiden</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>NicMar</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>P</type>
        <cFiled>US</cFiled>
        <ref>GAL-011-US-PSP[2]</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5811869">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>NicMar</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>CA</cFiled>
        <ref>GAL-011-CA-PCT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123753">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>FR</cFiled>
        <ref>GAL-011-FR-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123917">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>NL</cFiled>
        <ref>GAL-011-NL-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5811520">
        <addData>
        <entry>
        <key>CS</key>
        <value>Ee</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>NicMar</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>P</type>
        <cFiled>US</cFiled>
        <ref>GAL-011-US-PSP</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123712">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VD</type>
        <cFiled>BE</cFiled>
        <ref>GAL-011-BE-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5811950">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>K</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>NicMar</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>N</type>
        <cFiled>JP</cFiled>
        <ref>GAL-011-JP-PCT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123958">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>Leiden</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>N</type>
        <cFiled>CH</cFiled>
        <ref>GAL-011-CH-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123794">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>DE</cFiled>
        <ref>GAL-011-DE-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5812102">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>NicMar</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>CON</type>
        <cFiled>US</cFiled>
        <ref>GAL-011-US-CNT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5811730">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>NicMar</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>N</type>
        <cFiled>WO</cFiled>
        <ref>GAL-011-WO-PCT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5811892">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>EP</cFiled>
        <ref>GAL-011-EP-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123999">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>GB</cFiled>
        <ref>GAL-011-GB-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123835">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>IE</cFiled>
        <ref>GAL-011-IE-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6123876">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>L</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>LU</cFiled>
        <ref>GAL-011-LU-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_5812078">
        <addData>
            <entry>
            <key>CS</key>
            <value>A</value>
            </entry>
            <entry>
            <key>IP</key>
            <value>L</value>
            </entry>
            <entry>
            <key>Div</key>
            <value>GNV</value>
            </entry>
            <entry>
            <key>CC</key>
            <value>GNV</value>
            </entry>
            <entry>
            <key>Att</key>
            <value>NicMar</value>
            </entry>
            <entry>
            <key>O</key>
            <value>GNV</value>
            </entry>
            <entry>
            <key>Appl</key>
            <value>GNV</value>
            </entry>
            </addData>
        <type>N</type>
        <cFiled>US</cFiled>
        <ref>GAL-011-US-NP</ref>
        </rec>
    </recs>
    <keys>
    <kw>
    <name>Technology</name>
    <type>Technology</type>
    </kw>
    <kw>
    <name>Oncology (GLPG)</name>
    <type>Alliance_Program</type>
    </kw>
    </keys>
    <col>false</col>
    <costMod>1.0</costMod>
</rf>
    <rf id="cc_5_Att_2_FamId_5962036">
    <CC>cc_5_Att_2</CC>
    <name>Methods and Means for Treatment of Osteoarthritis</name>
    <ref>GAL-099</ref>
    <recs>
        <rec id="cc_5_Att_2_RecId_205359668">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>NL</cFiled>
        <ref>GAL-099-NL-ETD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6339136">
        <addData>
        <entry>
        <key>CS</key>
        <value>Ee</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>KurSer</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>P</type>
        <cFiled>US</cFiled>
        <ref>GAL-099-US-PSP</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_201785125">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>KurSer</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>D</type>
        <cFiled>US</cFiled>
        <ref>GAL-099-US-PCD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_203142672">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>D</type>
        <cFiled>US</cFiled>
        <ref>GAL-099-US-PCD[2]</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_205359581">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>BE</cFiled>
        <ref>GAL-099-BE-ETD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_205359752">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>FR</cFiled>
        <ref>GAL-099-FR-ETD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_201123283">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>US</cFiled>
        <ref>GAL-099-US-PCT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_205359835">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>DE</cFiled>
        <ref>GAL-099-DE-ETD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_203179552">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>DIV</type>
        <cFiled>EP</cFiled>
        <ref>GAL-099-EP-ETD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_203073558">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>JP</cFiled>
        <ref>GAL-099-JP-PCD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_201123156">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>KurSer</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>EP</cFiled>
        <ref>GAL-099-EP-EPT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_205359920">
        <addData>
        <entry>
        <key>CS</key>
        <value>G</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>BenJul</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>VP</type>
        <cFiled>GB</cFiled>
        <ref>GAL-099-GB-ETD</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_201123239">
        <addData>
        <entry>
        <key>CS</key>
        <value>A</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>KurSer</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>JP</cFiled>
        <ref>GAL-099-JP-PCT</ref>
        </rec>
        <rec id="cc_5_Att_2_RecId_6517847">
        <addData>
        <entry>
        <key>CS</key>
        <value>Ed</value>
        </entry>
        <entry>
        <key>IP</key>
        <value>M</value>
        </entry>
        <entry>
        <key>Div</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>CC</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Att</key>
        <value>KurSer</value>
        </entry>
        <entry>
        <key>O</key>
        <value>GNV</value>
        </entry>
        <entry>
        <key>Appl</key>
        <value>GNV</value>
        </entry>
        </addData>
        <type>NORMAL</type>
        <cFiled>WO</cFiled>
        <ref>GAL-099-WO-PCT</ref>
        </rec>
        </recs>
    <col>false</col>
    <costMod>1.0</costMod>
    </rf>
</rfs>

The XSLT is as follows :-

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:output method="xml" indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="rfs">
    <xsl:copy>
      <xsl:for-each-group select="rf/recs/rec/addData" composite="true" group-by="entry[key = ('CC', 'Att')]/value">
      <xsl:variable name="famId">
    <xsl:value-of select="substring-after(substring-after(substring-after(substring-after(ancestor::rf/@id,'_'),'_'),'_'),'_')"></xsl:value-of>
</xsl:variable>
 <xsl:variable name="id">
            <xsl:value-of select="current-grouping-key()"></xsl:value-of>
        </xsl:variable>
        <xsl:variable name="finalFamId">
            <xsl:value-of select="concat($id,$famId)"/>
        </xsl:variable>
        
        <rf id="{$finalFamId}">
           <xsl:apply-templates select="ancestor::rf/addData" mode="subtree"/>
            <CC>
             <xsl:value-of select="$id"></xsl:value-of>
        </CC>
         <xsl:apply-templates select="ancestor::rf/name" mode="subtree"/>
        <xsl:apply-templates select="ancestor::rf/reference" mode="subtree"/>
        <xsl:apply-templates select="ancestor::rf/recs" mode="subtree"/>
        <xsl:apply-templates select="ancestor::rf/col" mode="subtree"/>
       <xsl:apply-templates select="ancestor::rf/costMod" mode="subtree"/>
        </rf>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
  
  <xsl:mode name="subtree" on-no-match="shallow-copy"/>
  
 <xsl:template match="recs/rec" mode="subtree">
    <xsl:if test=". intersect current-group()/..">
    <xsl:for-each select=".">
<xsl:variable name="recid">
            <xsl:value-of select="current-grouping-key()"></xsl:value-of>
        </xsl:variable>
        <xsl:variable name="origid">
    <xsl:value-of select="substring-after(substring-after(substring-after(substring-after(@id,'_'),'_'),'_'),'_')"></xsl:value-of>
</xsl:variable>
      <rec>
    <xsl:attribute name="id"> 
        <xsl:value-of select="$recid||'_'||$origid"/>
    </xsl:attribute>
    <xsl:apply-templates select="./addData" mode="subtree"/>
    <xsl:apply-templates select="./ref" mode="subtree"/>
            </rec>
    </xsl:for-each>
    </xsl:if>
   </xsl:template>

  </xsl:stylesheet>

My desired output XML should look like is -

<rfs>
<rf id="GNV BenJulFamId_5811357">
    <CC>GNV BenJul</CC>
    <recs>
      <rec id="GNV BenJul_RecId_6123671">
      <rec id="GNV BenJul_RecId_6123753">
      <rec id="GNV BenJul_RecId_6123917">
      <rec id="GNV BenJul_RecId_6123712">
      <rec id="GNV BenJul_RecId_6123958">
      <rec id="GNV BenJul_RecId_6123794">
      <rec id="GNV BenJul_RecId_5811892">
      <rec id="GNV BenJul_RecId_6123999">
      <rec id="GNV BenJul_RecId_6123835">
      <rec id="GNV BenJul_RecId_6123876">
      </recs
<rf id="GNV NicMarFamId_5811357">
   <CC>GNV NicMar</CC>
   <recs>
     <rec id="GNV NicMar_RecId_5811597"/>
     <rec id="GNV NicMar_RecId_5811869"/>
     <rec id="GNV NicMar_RecId_5811520"/>
     <rec id="GNV NicMar_RecId_5811950"/>
     <rec id="GNV NicMar_RecId_5812102"/>
     <rec id="GNV NicMar_RecId_5811730"/>
     <rec id="GNV NicMar_RecId_5812078"/>
  </recs>
</rf>
<rf id="GNV BenJulFamId_5962036">
   <CC>GNV BenJul</CC>
   <recs>
     <rec id="GNV BenJul_RecId_205359668"/>
     <rec id="GNV BenJul_RecId_203142672"/>
     <rec id="GNV BenJul_RecId_205359581"/>
     <rec id="GNV BenJul_RecId_205359752"/>
     <rec id="GNV BenJul_RecId_201123283"/>
     <rec id="GNV BenJul_RecId_205359835"/>
     <rec id="GNV BenJul_RecId_203179552"/>
     <rec id="GNV BenJul_RecId_203073558"/>
     <rec id="GNV BenJul_RecId_205359920"/> 
   </recs>
    </rf>
<rf id="GNV KurSer_FamId_5962036">
   <CC>GNV KurSer</CC>  
   <recs>
     <rec id="GNV KurSer_RecId_6339136"/>
     <rec id="GNV KurSer_RecId_201785125"/>
     <rec id="GNV KurSer_RecId_201123156"/>
     <rec id="GNV KurSer_RecId_201123239"/>
     <rec id="GNV KurSer_RecId_6517847"/>
   </recs>
</rf>
</rfs>

Any help would be really appreciated. My XSLT is only grouping the first <rf> but not working for the rest of the xml.

1 Answers

Your for-each-group select was a level to deep. You had:

<xsl:for-each-group select="rf/recs/rec/addData" composite="true" group-by="entry[key = ('CC', 'Att')]/value">

Should be:

<xsl:for-each-group select="rf/recs/rec" composite="true" group-by="addData/entry[key = ('CC', 'Att')]/value">

And the rest I did not quite understand, but this xslt will give you a good starting-point:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">
  
  <xsl:output method="xml" indent="yes"/>
  
  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="rfs">
    <xsl:copy>
      <xsl:for-each-group select="rf/recs/rec" composite="true" group-by="addData/entry[key = ('CC', 'Att')]/value">
        <xsl:variable name="famId">
          <xsl:value-of select="substring-after(substring-after(substring-after(substring-after(ancestor::rf/@id,'_'),'_'),'_'),'_')"></xsl:value-of>
        </xsl:variable>
        <xsl:variable name="id">
          <xsl:value-of select="current-grouping-key()"></xsl:value-of>
        </xsl:variable>
        <xsl:variable name="finalFamId">
          <xsl:value-of select="concat($id,$famId)"/>
        </xsl:variable>
        
        <rf id="{$finalFamId}">
          <CC>
            <xsl:value-of select="$id"/>
          </CC>
          <recs>
            <xsl:apply-templates select="current-group()"/>
          </recs>
        </rf>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
  
  
  <xsl:template match="recs/rec" >
    <xsl:copy>
      <xsl:copy-of select="@id"/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>
Related