Search code examples
xmlxsltxslt-2.0

Need to fetch the value from the multiple groups using <xsl:each>


I need to fetch the Description value from the multiple PlanDetail using <xsl:each

Input xml I'm having:

<PlanDetails>
    <PlanDetail>
        <Number>1</Number>
        <Description>Management</Description>
    </PlanDetail>
    <PlanDetail>
        <Number>2</Number>
        <Description>Employees</Description>
    </PlanDetail>
    <PlanDetail>
        <Number>1</Number>
        <Description>Management</Description>
    </PlanDetail>
    <PlanDetail>
        <Number>2</Number>
        <Description>Employees</Description>
    </PlanDetail>
</PlanDetails>

Xsl I have used:

<xsl:template match="PlanDetails">
    <xsl:variable name="Number" select="PlanDetails/PlanDetail/Number"/>
    <xsl:for-each select="PlanDetails/PlanDetail[Number=$Number][1]">
        <row>
            <entry>
                <p>Class 
                    <xsl:value-of select="Number"/>: 
                    <xsl:value-of select="Description"
               />
                </entry>
            </row>
        </xsl:for-each>
    </xsl:template>

I'm getting the below output:

<row>
    <entry>
        <p>Class 1: Management</p>
    </entry>
    <entry>
        <p>Class 2: Employees</p>
    </entry>
    <entry>
        <p>Class 1: Management</p>
    </entry>
    <entry>
        <p>Class 2: Employees</p>
    </entry>
</row>

Expected output:

<row>
    <entry>
        <p>Class 1: Management</p>
    </entry>
    <entry>
        <p>Class 2: Employees</p>
    </entry>
</row>

As I'm having large number of I need to fetch the class number 1 of first plandetails and class number 2 of first plandetails.


Solution

  • Use <xsl:for-each-group select="PlanDetails/PlanDetail" group-by="Number"><row>..</row></xsl:for-each-group>.