0

I am getting an XML in the below format from one of the system. I need to transform the XML.

<parentTag>
    <childTag>
        <date>28-Jan-2017</date>
        <code>DoB</code>
        <oldStatus>g</oldStatus>
        <newStatus>22</newStatus>
    </childTag>

    <childTag>
        <date>27-Jan-2017</date>
        <code>www</code>
        <oldStatus>25</oldStatus>
        <newStatus>g</newStatus>
    </childTag>

    <childTag>
        <date>26-Jan-2017</date>
        <code>DoB</code>
        <oldStatus>56</oldStatus>
        <newStatus>73</newStatus>
    </childTag>

    <childTag>
        <date>26-Jan-2017</date>
        <code>www</code>
        <oldStatus>66</oldStatus>
        <newStatus>55</newStatus>
    </childTag>
</parentTag>

I need to collect all the details for each of the code and transform the XML as below using XSLT 1.0.

<parentTag>
    <childTag>
        <code>DoB</code>
        <status>
            <date>28-Jan-2017</date>
            <oldStatus>g</oldStatus>
            <newStatus>22</newStatus>
        </status>
        <status>
            <date>26-Jan-2017</date>
            <oldStatus>56</oldStatus>
            <newStatus>73</newStatus>
        </status>
    </childTag>

    <childTag>
        <code>www</code>
        <status>
            <date>27-Jan-2017</date>
            <oldStatus>25</oldStatus>
            <newStatus>g</newStatus>
        </status>
        <status>
            <date>26-Jan-2017</date>
            <oldStatus>66</oldStatus>
            <newStatus>55</newStatus>
        </status>
    </childTag>
</parentTag>

I request you to help on this.

thanks.

zx485
  • 28,498
  • 28
  • 50
  • 59
  • Possible duplicate of [xslt grouping by calling template](https://stackoverflow.com/questions/15132763/xslt-grouping-by-calling-template) – ophychius Jul 25 '17 at 08:59
  • Similar questions have been asked many times over. Have you tried searching? – ophychius Jul 25 '17 at 09:00

1 Answers1

1

You can use muenchian grouping in xslt 1.0

<?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="1.0">


    <xsl:key name="keycode" match="childTag" use="code"/>

    <xsl:template match="parentTag">
        <xsl:copy>
        <xsl:for-each select="childTag[generate-id() = generate-id(key('keycode', code)[1])]">
        <childTag>
            <xsl:copy-of select="code"/>
            <xsl:variable name="currentcode" select="normalize-space(code)"/>
            <xsl:for-each select="key('keycode', $currentcode)">
                <status>
                    <xsl:copy-of select="date|oldStatus|newStatus"/>
                </status>
            </xsl:for-each>
        </childTag>
        </xsl:for-each>            
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
Rupesh_Kr
  • 3,395
  • 2
  • 17
  • 32