简体   繁体   中英

Need to convert XML for unique code in XSLT 1.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.

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM