Click here to Skip to main content
15,885,890 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I want to split each <rf> into parts after grouping values of <key>CC</key> and <key>Att</key> found in <recs/rec/addData/entry of that particular <rf>

I am able to achieve it to some extent , but not in a consistent way. With some data <rf> is getting missed or sometimes <rec id=""> are not appearing under corresponding <rf>.
My Sample XML is :-
<
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rfs>
  <rf id="cc_1_at_2_fid_3">
        <addData>
            <entry>
                <key>CC</key>
                <value>ASARL</value>
            </entry>
            <entry>
                <key>Att</key>
                <value>BAR, Grégory  Louis Joseph </value>
            </entry>
            <entry>
                <key>Own</key>
                <value>ASARL</value>
            </entry>
            <entry>
                <key>Own</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>App</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>App</key>
                <value>ASARL</value>
            </entry>
        </addData>
        <CC>cc_1_at_2</CC>
        <name>XYZ</name>
        <ref>AV-25</ref>
        <recs>
            <rec id="cc_1_at_2_204122094">
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>Div</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AV-25-1</ref>
                <att>BARJoseph </att>
                <agent>CP</agent>
            </rec>
            <rec id="cc_1_at_2_204121989">
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AB-25-2</ref>
                <owner>ANV</owner>
               </rec>
            <rec id="cc_1_at_2_203449195">
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Pappl</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AB-25-3</ref>
                <att>BAoseph </att>
            </rec>
            <rec id="cc_1_at_2_204123928">
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
               <ref>AB-25-4</ref>
                 <att>BAJoseph </att>
            </rec>
            <rec id="cc_1_at_2_204124349">
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Abandoned</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AB-252-5</ref>
               <att>BARJoseph </att>
            </rec>
        </recs>
        <col>false</col>
        <costMod>1.0</costMod>
    </rf>
   <rf id="cc_5_at_3_fid_5">
        <addData>
        <entry>
            <key>C</key>
                <value>Fd</value>
            </entry>
                 <entry>
                <key>IT</key>
                <value>Asso</value>
            </entry>
        </addData>
        <CC>cc_5_at_3</CC>
        <name>ABCD</name>
        <ref>GAL-099</ref>
        <recs>
            <rec id="cc_5_at_3_RecordId_205359668">
                <addData>
                    <entry>
                        <key>CS</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJuian</value>
                    </entry>
                    <entry>
                        <key>Owner</key>
                        <value>Galapagos NV</value>
                    </entry>
                    <entry>
                        <key>Applicant</key>
                        <value>Galapagos NV</value>
                    </entry>
                </addData>
            </rec>
            <rec id="cc_5_at_3_RecordId_6339136">
                <addData>
                 <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>KSe</value>
                    </entry>
                  </addData>
             </rec>
            <rec id="cc_5_at_3_RecordId_201785125">
                <addData>
                      <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Attorney</key>
                        <value>KSe</value>
                    </entry>
                    </addData>
              </rec>
            <rec id="cc_5_at_3_RecordId_203142672">
                <addData>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJuian</value>
                    </entry>
                    </addData>
             </rec>
</recs>
        <col>false</col>
        <costMod>1.0</costMod>
    </rf>
   <rf id="cc_9_at_79_fid_6">
        <addData>
             <entry>
                <key>App</key>
                <value>G</value>
            </entry>
            <entry>
                <key>IT</key>
                <value>Asso</value>
            </entry>
        </addData>
        <costCentre>cc_9_at_79</costCentre>
        <name>molecular targets and compounds, and methods to identify the same, useful in the treatment of joint degenerative and inflammatory diseases
</name>
        <ref>GAL-054</ref>
          <recs>
            <rec id="cc_9_at_79_RecordId_6036063">
            <addData>
                  <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>Nich</value>
                    </entry>
                </addData>
            </rec>
            <rec id="cc_9_at_79_RecordId_6485552">
            <addData>
                      <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Attorney</key>
                        <value>Nich</value>
                    </entry>
            </addData>
              </rec>
         </recs>
        <col>false</col>
        <costMod>1.0</costMod>
    </rf>
  </rfs>

>

What I have tried:

The XSLT that I have tried is
<?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"/>
			</rec>
	</xsl:for-each>
    </xsl:if>
   </xsl:template>

  </xsl:stylesheet>


What I want is even if splitting is not required , the data should come as it is which is not appearing.
Any help would be really appreciated.Thanks.
Posted
Updated 29-Mar-22 9:38am

1 solution

Well, you can use Linq. See:
C#
void Main()
{
	XDocument xdoc = GetXmlData();
	var result = xdoc.Descendants("rf")
		.GroupBy(x => new {CC = x.Value.Equals("CC"), Att = x.Value.Equals("Att")})
		.ToList();
	result.Dump();
}

// Define other methods and classes here
public XDocument GetXmlData()
{
	string s = @"<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<rfs>
  <rf id='cc_1_at_2_fid_3'>
        <addData>
            <entry>
                <key>CC</key>
                <value>ASARL</value>
            </entry>
            <entry>
                <key>Att</key>
                <value>BAR, Grégory  Louis Joseph </value>
            </entry>
            <entry>
                <key>Own</key>
                <value>ASARL</value>
            </entry>
            <entry>
                <key>Own</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>App</key>
                <value>GNV</value>
            </entry>
            <entry>
                <key>App</key>
                <value>ASARL</value>
            </entry>
        </addData>
        <CC>cc_1_at_2</CC>
        <name>XYZ</name>
        <ref>AV-25</ref>
        <recs>
            <rec id='cc_1_at_2_204122094'>
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>Div</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AV-25-1</ref>
                <att>BARJoseph </att>
                <agent>CP</agent>
            </rec>
            <rec id='cc_1_at_2_204121989'>
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AB-25-2</ref>
                <owner>ANV</owner>
               </rec>
            <rec id='cc_1_at_2_203449195'>
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Pappl</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AB-25-3</ref>
                <att>BAoseph </att>
            </rec>
            <rec id='cc_1_at_2_204123928'>
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Grant</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
               <ref>AB-25-4</ref>
                 <att>BAJoseph </att>
            </rec>
            <rec id='cc_1_at_2_204124349'>
                <addData>
                    <entry>
                        <key>CSta</key>
                        <value>Abandoned</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJoseph </value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>ASARL</value>
                    </entry>
                    <entry>
                        <key>Own</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>App</key>
                        <value>ASARL</value>
                    </entry>
                </addData>
                <ref>AB-252-5</ref>
               <att>BARJoseph </att>
            </rec>
        </recs>
        <col>false</col>
        <costMod>1.0</costMod>
    </rf>
   <rf id='cc_5_at_3_fid_5'>
        <addData>
        <entry>
            <key>C</key>
                <value>Fd</value>
            </entry>
                 <entry>
                <key>IT</key>
                <value>Asso</value>
            </entry>
        </addData>
        <CC>cc_5_at_3</CC>
        <name>ABCD</name>
        <ref>GAL-099</ref>
        <recs>
            <rec id='cc_5_at_3_RecordId_205359668'>
                <addData>
                    <entry>
                        <key>CS</key>
                        <value>G</value>
                    </entry>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJuian</value>
                    </entry>
                    <entry>
                        <key>Owner</key>
                        <value>Galapagos NV</value>
                    </entry>
                    <entry>
                        <key>Applicant</key>
                        <value>Galapagos NV</value>
                    </entry>
                </addData>
            </rec>
            <rec id='cc_5_at_3_RecordId_6339136'>
                <addData>
                 <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>KSe</value>
                    </entry>
                  </addData>
             </rec>
            <rec id='cc_5_at_3_RecordId_201785125'>
                <addData>
                      <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Attorney</key>
                        <value>KSe</value>
                    </entry>
                    </addData>
              </rec>
            <rec id='cc_5_at_3_RecordId_203142672'>
                <addData>
                    <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>BJuian</value>
                    </entry>
                    </addData>
             </rec>
</recs>
        <col>false</col>
        <costMod>1.0</costMod>
    </rf>
   <rf id='cc_9_at_79_fid_6'>
        <addData>
             <entry>
                <key>App</key>
                <value>G</value>
            </entry>
            <entry>
                <key>IT</key>
                <value>Asso</value>
            </entry>
        </addData>
        <costCentre>cc_9_at_79</costCentre>
        <name>molecular targets and compounds, and methods to identify the same, useful in the treatment of joint degenerative and inflammatory diseases
</name>
        <ref>GAL-054</ref>
          <recs>
            <rec id='cc_9_at_79_RecordId_6036063'>
            <addData>
                  <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Att</key>
                        <value>Nich</value>
                    </entry>
                </addData>
            </rec>
            <rec id='cc_9_at_79_RecordId_6485552'>
            <addData>
                      <entry>
                        <key>CC</key>
                        <value>GNV</value>
                    </entry>
                    <entry>
                        <key>Attorney</key>
                        <value>Nich</value>
                    </entry>
            </addData>
              </rec>
         </recs>
        <col>false</col>
        <costMod>1.0</costMod>
    </rf>
  </rfs>";

	return XDocument.Load(new StringReader(s), LoadOptions.None);

}


Above code will return 3 rf items:
XML
<rf id="cc_1_at_2_fid_3">...</rf>
<rf id="cc_5_at_3_fid_5">...</rf>
<rf id="cc_9_at_79_fid_6">...</rf>
 
Share this answer
 
Comments
Richard Deeming 30-Mar-22 3:39am    
NB: XDocument.Load(new StringReader(s), LoadOptions.None) could be simplified to XDocument.Parse(s). :)
Maciej Los 30-Mar-22 6:34am    
I know. Thank you, Richard.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900