xsl-list
[Top] [All Lists]

RE: Navigating XML Using Attributes

2003-02-11 15:50:17
This might help out if you want to get the xml into a more hierarchical
structure.  It ought to make the document a little more sensical (more
depth, less height).

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:template match="/*">
                <xsl:apply-templates select="*[position()=1]" />
        </xsl:template>
        <!--<xsl:template match="*/child::*">-->
        <xsl:template match="*">
                <xsl:variable name="lname" select="name()"/>
                <xsl:element name="{$lname}">
                        <xsl:attribute name="Id"><xsl:value-of
select="@Id"/></xsl:attribute>
                        <xsl:variable name="myID" select="@Id" />
                        <xsl:if test="not(child::*)">
                                <xsl:value-of select="."/>
                        </xsl:if>
                        <xsl:apply-templates
select="*|following::*[(_at_)Id=$myID]" />
                </xsl:element>
        </xsl:template>
</xsl:stylesheet>

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Pilarski,James
Sent: Tuesday, February 11, 2003 4:43 PM
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Navigating XML Using Attributes


I have an XML document that was dumped from a database.  Instead of the
elements being nested in an appropriate, well-formed XML fashion, they are
associated with ID attributes.  The following XML is a generalized sample
with Account being the root element:

<?xml version="1.0" encoding="UTF-8"?>
<Account>
        <LevelA1>
                <LevelA2>
                        <LevelA3 Id="111"/>
                        <LevelA3 Id="222"/>
                        <LevelA3 Id="333"/>
                </LevelA2>
        </LevelA1>
        <LevelA3 Id="111">
                <LevelB1>
                        <LevelB2 Id="1"/>
                        <LevelB2 Id="2"/>
                        <LevelB2 Id="3"/>
                        <LevelB2 Id="4"/>
                </LevelB1>
        </LevelA3>
        <LevelB2 Id="1">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelB2 Id="2">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelB2 Id="3">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelB2 Id="4">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelA3 Id="222">
                <LevelB1>
                        <LevelB2 Id="5"/>
                        <LevelB2 Id="6"/>
                        <LevelB2 Id="7"/>
                        <LevelB2 Id="8"/>
                </LevelB1>
        </LevelA3>
        <LevelB2 Id="5">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelB2 Id="6">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelB2 Id="7">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelB2 Id="8">
                <LevelC1>data</LevelC1>
        </LevelB2>
        <LevelA3 Id="333">
                <LevelB1>
                        <LevelB2 Id="9"/>
                        <LevelB2 Id="10"/>
                        <LevelB2 Id="11"/>
                        <LevelB2 Id="12"/>
                </LevelB1>
        </LevelA3>
        <LevelB2 Id="9">
                <LevelC1>DataAlpha</LevelC1>
        </LevelB2>
        <LevelB2 Id="10">
                <LevelC1>DataBeta</LevelC1>
        </LevelB2>
        <LevelB2 Id="11">
                <LevelC1>DataGamma</LevelC1>
        </LevelB2>
        <LevelB2 Id="12">
                <LevelC1>DataDelta</LevelC1>
        </LevelB2>
</Account>

To navigate the XML document, one must pull the Ids from element <LevelA3>
and return to the <Account> level to find the <LevelA3> elements that reside
in the document just below <Account>.  Once the appropriate <LevelA3>
element is found, the XSL must find its way to <LevelB2>, grab its Id,
return to the top and find <LevelB2> below.  This continues until the data
contained in <LevelC1> is found.  For example, the path to DataGamma is:
Account/LevelA1/LevelA2/LevelA3 Id="333"/LevelB1/LevelB2
Id="11"/LevelC1:DataGamma

I assume I will have to use apply-templates again and again.  What I don't
know is how to remember all the Ids in LevelA3, and below, so I can find
each of the cooresponding elements.  Any suggestions?

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>