1

Please note that source xml fieldscome in sequence means one student's info then another student info.

Can you help on the XSLT to break xml as one group node for each student

My Input is Below

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <item>
        <columnName>StudentID</columnName>
        <value>2356</value>
    </item>
    <item>
        <columnName>StudentName</columnName>
        <value>Java</value>
    </item>
    <item>
        <columnName>City</columnName>
        <value>Chicago</value>
    </item>
    <item>
        <columnName>StudentID</columnName>
        <value>4578</value>
    </item>
    <item>
        <columnName>StudentName</columnName>
        <value>Net</value>
    </item>
    <item>
        <columnName>City</columnName>
        <value>NewYork</value>
    </item>
    <item>
        <columnName>StudentID</columnName>
        <value>5892</value>
    </item>
    <item>
        <columnName>StudentName</columnName>
        <value>Office</value>
    </item>
    <item>
        <columnName>City</columnName>
        <value>Dallas</value>
    </item>
    
</root>

I need Output

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <Record>
        <item>
            <columnName>StudentID</columnName>
            <value>2356</value>
        </item>
        <item>
            <columnName>StudentName</columnName>
            <value>Java</value>
        </item>
        <item>
        <columnName>City</columnName>
        <value>Chicago</value>
    </item>
    </Record>
    <Record>
        <item>
            <columnName>StudentID</columnName>
            <value>4578</value>
        </item>
        <item>
            <columnName>StudentName</columnName>
            <value>Net</value>
        </item>
       <item>
        <columnName>City</columnName>
        <value>NewYork</value>
    </item>
    </Record>
    <Record>
        <item>
            <columnName>StudentID</columnName>
            <value>5892</value>
        </item>
        <item>
            <columnName>StudentName</columnName>
            <value>Office</value>
        </item>
     <item>
        <columnName>City</columnName>
        <value>Dallas</value>
    </item>
    </Record>

</root>

Please note that source xml fileds come in sequence means one student info then another student info.

Can you help on the XSLT to break xml as one group node for each student

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>
    <xsl:template match="root">
        <root>
            <Record>
                <xsl:apply-templates select="data"/>

            </Record>
            <Record/>
        </root>
    </xsl:template>

    <xsl:template match="data">
        <data>
            <xsl:apply-templates select="columnName"/>
            <xsl:apply-templates select="value"/>
        </data>
    </xsl:template>

    <xsl:template match="columnName">
        <columnName>
            <xsl:value-of select="."/>
        </columnName>
    </xsl:template>

    <xsl:template match="value">
        <value>
            <xsl:value-of select="."/>
        </value>
    </xsl:template>

</xsl:stylesheet>

Please note that source xml fileds come in sequence means one student info then another student info.

Can you help on the XSLT to break xml as one group node for each student

1 Answers1

2

Assuming that items always come in groups of three, you could do simply:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="item[position() mod 3 = 1]">
            <Record>
                <xsl:copy-of select=". | following-sibling::item[position() &lt; 3]"/>
            </Record>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>  
michael.hor257k
  • 113,275
  • 6
  • 33
  • 51