Hari
Hari

Reputation: 397

How to iterate each xml tag having different names and values ? How to start iterating from a particular tag ? in xslt 2.0

I have the below xml text,

<SUBSCRIBER>
    <Anumber>639081000000</Anumber>
    <FirstCallDate>20130430104419</FirstCallDate>
    <SetyCode>TNT</SetyCode>
    <Status>ACT</Status>
    <RoamIndicator/>
    <PreloadCode>P1</PreloadCode>
    <CreationDate>20130116100037</CreationDate>
    <PreActiveEndDate/>
    <ActiveEndDate>20130804210541</ActiveEndDate>
    <GraceEndDate>20140502210541</GraceEndDate>
    <RetailerIndicator/>
    <OnPeakAccountID>9100</OnPeakAccountID>
    <OnPeakSmsExpDate>20130804210504</OnPeakSmsExpDate>
    <UnivWalletAcc/>
    <UnliSmsOnCtl>20130606211359</UnliSmsOnCtl>
    <UnliSmsTriCtl/>
    <UnliSmsGblCtl/>
    <UnliMocOnCtl>20130606211359</UnliMocOnCtl>
    <UnliMocTriCtl/>
    <UnliMocGblCtl/>
    <UnliSurfFbcCtl>20130606212353</UnliSurfFbcCtl>
</SUBSCRIBER>

How can I iterate/parse over each xml tag name and get the value ( I need the name of the tag and value in a different variables) ? And also, How can I start iterating from particular tag name ? Ex: I would like to start iterating UnivWalletAcc

Please advise.

So far, I have tried the following,

<xsl:template match="SUBSCRIBER">
    <xsl:variable name="tagName">
        <xsl:value-of select="/*/*/name()"/>
    </xsl:variable>
    <xsl:variable name="tagValue">
        <xsl:value-of select="/*/*/text()"/>
    </xsl:variable>
    <xsl:value-of select="$tagName"/>
    <xsl:value-of select="$tagValue"/>
</xsl:template>

Upvotes: 0

Views: 410

Answers (2)

Michael Kay
Michael Kay

Reputation: 163262

As an alternative to Veenstra's solution, instead of the xsl:if in the SUBSCRIBER/* template, you can control the iteration in the apply-templates:

<xsl:template match="SUBSCRIBER">
    <data>
        <xsl:apply-templates select="UnivWalletAcc, 
                                     UnivWalletAcc/following-sibling::*" />
    </data>
</xsl:template>

Upvotes: 3

Mark Veenstra
Mark Veenstra

Reputation: 4739

With the following XSLT you can loop through all childs of the node SUBSCRIBER:

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

    <!-- Identity template that will loop over all nodes and attributes -->
    <xsl:template match="@*|node()">
        <xsl:apply-templates select="@*|node()" />
    </xsl:template>

    <!-- Template to match the root and create new root -->
    <xsl:template match="SUBSCRIBER">
        <data>
            <xsl:apply-templates select="@*|node()" />
        </data>
    </xsl:template>

    <!-- Template to loop over all childs of SUBSCRIBER node -->
    <xsl:template match="SUBSCRIBER/*">
        <!-- This will test if we have seen the UnivWalletAcc node already, if so, output something, otherwise, output nothing -->
        <xsl:if test="preceding-sibling::UnivWalletAcc or self::UnivWalletAcc">
            <tag>
                <tagName><xsl:value-of select="name()" /></tagName>
                <tagValue><xsl:value-of select="." /></tagValue>
            </tag>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Upvotes: 1

Related Questions