user2628187
user2628187

Reputation: 307

Looping in a specific structure with xsl:apply-templates

I'm trying to create list elements in the below structure using xsl:apply-templates. Is it possible to achieve the below output without using xsl:for-each? i am able to acheive thee below structure with xsl:for-each but would like to know if it is possible with xsl:apply-templates.

Below is my XML

<Properties>
    <Root>
        <group-container>
            <group-title>
                <title-name>Packs1</title-name>
                <title-sub-links>
                    <subtitle-name>sub1</subtitle-name>
                </title-sub-links>
                <title-sub-links>
                    <subtitle-name>sub2</subtitle-name>
                </title-sub-links>
            </group-title>
            <group-title>
                <title-name>Packs2</title-name>
                <title-sub-links>
                    <subtitle-name>abc</subtitle-name>
                </title-sub-links>
                <title-sub-links>
                    <subtitle-name>xyz</subtitle-name>
                </title-sub-links>
            </group-title>
        </group-container>
        <group-title>
            <title-name>link title 1</title-name>
        </group-title>
        <group-title>
            <title-name>link xyz</title-name>
        </group-title>
    </Root>
</Properties>

XSL

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="/">
        <div class="col-9 tab">
            <ul>
                <xsl:apply-templates select = "/Properties/Root/group-container/group-title"/>
                <xsl:apply-templates select = "/Properties/Root/group-container/group-title/title-sub-links"/>
            </ul>
        </div>

    </xsl:template>
    <xsl:template match = "group-title">
        <li>
            <xsl:value-of select="title-name"/>
        </li>
    </xsl:template>
    <xsl:template match = "title-sub-links">
        <li>
            <xsl:value-of select="subtitle-name"/>
        </li>
    </xsl:template>
</xsl:stylesheet>

Output received

<div class="col-9 tab">
    <ul>
        <li>Packs1</li>
        <li>Packs2</li>
        <li>sub1</li>
        <li>sub2</li>
        <li>abc</li>
        <li>xyz</li>
    </ul>
</div>

Expected output

<div class="col-9 tab">
    <ul>
        <li>Packs1</li>
        <li>sub1</li>
        <li>sub2</li>
    </ul>
    <ul>
        <li>Packs2</li>
        <li>abc</li>
        <li>xyz</li>
    </ul>
</div>

Upvotes: 0

Views: 24

Answers (1)

michael.hor257k
michael.hor257k

Reputation: 117103

I think (!) you want to do:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:template match="/">
        <div class="col-9 tab">
            <xsl:apply-templates select = "/Properties/Root/group-container/group-title"/>
        </div>
    </xsl:template>

    <xsl:template match = "group-title">
        <ul>
            <li>
                <xsl:value-of select="title-name"/>
            </li>
            <xsl:apply-templates select = "title-sub-links"/>
         </ul>
    </xsl:template>

    <xsl:template match = "title-sub-links">
        <li>
            <xsl:value-of select="subtitle-name"/>
        </li>
    </xsl:template>

</xsl:stylesheet>

Upvotes: 1

Related Questions