1

this is my XML:

<?xml version="1.0" encoding="utf-8"?>
<records>
<CompanyCode>12345</CompanyCode>
<FirstName>Dan<FirstName>
<LastName>Haggerty<LastName>
<TeamMemberRole>CS Director<TeamMemberRole>
</records>
<records>
<CompanyCode>12345</CompanyCode>
<FirstName>And<FirstName>
<LastName>Onemore<LastName>
<TeamMemberRole>CS Director<TeamMemberRole>
</records>
<records>
 <CompanyCode>12345</CompanyCode>
 <FirstName>And<FirstName>
<LastName>Twomore<LastName>
<TeamMemberRole>DifferentRole<TeamMemberRole>
</records>
<records>
<CompanyCode>54321</CompanyCode>
<FirstName>And<FirstName>
<LastName>Twomore<LastName>
<TeamMemberRole>DifferentRole<TeamMemberRole>
</records>

This is my Required Output:

<records>
<Company>
<CompanyCode>12345</CompanyCode>
<Role>
<TeamMemberRole>CS Director<TeamMemberRole>
<FirstName>Dan<FirstName>
<LastName>Haggerty<LastName>
<FirstName>And<FirstName>
<LastName>Onemore<LastName>
</Role>
<Role>
<TeamMemberRole>DifferentRole<TeamMemberRole>
<FirstName>And<FirstName>
<LastName>Twomore<LastName>
</Role>
</Company>
<Company>
<CompanyCode>54321</CompanyCode>
<Role>
<TeamMemberRole>DifferentRole<TeamMemberRole>
<FirstName>And<FirstName>
<LastName>Twomore<LastName>
</Role>
</Company>
</records>

My Current XSL:

<?xml version="1.0" encoding="utf-8"?>
 <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:element name="records">
            <xsl:for-each-group select="/records" group-by="CompanyCode">
                 <xsl:element name="Company">
                    <xsl:value-of select="CompanyCode"/>
                    <xsl:for-each-group select="current-group()" group-by ="TeamMemberRole">
                 <xsl: element name "role">        
                    <Role><xsl:value-of select="TeamMemberRole"/><Role>         
                    <FirstName><xsl:value-of select="FirstName"/><FirstName>
                    <LastName><xsl:value-of select="LastName"/><LastName>
                 </xsl:element>
             </xsl:for-each-group>

        </xsl:element>     

            </xsl:for-each-group>  
        </xsl:element>  

My Current Output:

<Company>
<CompanyCode>12345</wd:CustomerId>
      <Role>
         <wd:Role>CS Director</wd:Role>
         <wd:FirstName>Dan</wd:FirstName>
         <wd:LastName>Haggerty</wd:LastName>
      <Role>
      <Role>
         <Role>DifferentRole</wd:Role>
         <wd:FirstName>and</wd:FirstName>
         <wd:LastName>twomore</wd:LastName>
      <role>
   <Company>
<Company>
<CompanyCode>54321</wd:CustomerId>
      <Role>
         <wd:Role>DifferentRole</wd:Role>
         <wd:FirstName>and</wd:FirstName>
         <wd:LastName>twomore</wd:LastName>
      <Role>
<records>

Please don't my syntax errors. I'm more concerned at the grouping logic. If You see in current output, For the 1st company only one name appeared instead of two names for the first role. Please help.(info: There can many people for same role in one company and the names of role are same in all companies.)

  • Kumar Pidikti your input not well formed plz check input. – Sam Nov 06 '19 at 05:42
  • @Sandy please don't mind syntax errors. I'm concerned over the grouping logic. Please see my current output and required output. A record is being skipped when further being grouped by role. – Manoj Kumar Pidikiti Nov 06 '19 at 05:52
  • Are you sure that you want required output 1st role position two times FirstName and LastName? – Sam Nov 06 '19 at 05:57
  • @ManojKumarPidikiti Your "syntax errors" prevent us from using your code to reproduce your problem - thus wasting the time of anyone trying to help you. – michael.hor257k Nov 06 '19 at 06:18
  • @Sandy It is not two times. First name and last name of two people with the same role in the same company. – Manoj Kumar Pidikiti Nov 06 '19 at 07:14

1 Answers1

0

You can try this code

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="root">
        <records>
            <xsl:for-each-group select="records" group-by="CompanyCode">
                <Company>
                    <CompanyCode><xsl:value-of select="current-grouping-key()"/></CompanyCode>
                    <xsl:for-each-group select="current-group()" group-by="TeamMemberRole">
                        <Role>
                            <TeamMemberRole><xsl:value-of select="current-grouping-key()"/></TeamMemberRole>
                            <FirstName><xsl:value-of select="FirstName"/></FirstName>
                            <LastName><xsl:value-of select="LastName"/></LastName>
                        </Role>
                    </xsl:for-each-group>
                </Company>
            </xsl:for-each-group>
        </records>
    </xsl:template>
</xsl:stylesheet>

DEMO: https://xsltfiddle.liberty-development.net/ej9EGcU/4

Sam
  • 841
  • 1
  • 5
  • 15