Subject: Re: [xsl] flat xml to full tree with no repeating From: "Anton Triest" <anton@xxxxxxxx> Date: Wed, 22 Sep 2004 22:01:06 +0200 |
Hi Steve, You don't want to group your employees here, you want to nest them. Let's start with the top level: the one that doesn't have a manager: <xsl:variable name="big-boss-id" select="key('by-manager', '')/uid"/> Then you can start the tree from there and use apply-templates on all employees that have the big boss as manager: <xsl:template match="employees"> <nodes> <node> <top><xsl:value-of select="$big-boss-id"/></top> <xsl:apply-templates select="key('by-manager', $big-boss-id)"> <xsl:sort select="uid"/> </xsl:apply-templates> </node> </nodes> </xsl:template> You now need a template to match="employee", that adds new employees if he/she is somebody else's manager: <xsl:template match="employee"> <node> <bottom><xsl:value-of select="uid"/></bottom> <xsl:apply-templates select="key('by-manager', uid)"> <xsl:sort select="uid"/> </xsl:apply-templates> </node> </xsl:template> That will keep adding deeper levels recursively, and give you the output you wanted. Cheers Anton Steve Lenhart wrote: > > I have a flat xml file that i'm trying to make into a tree format with > out repeats, and still keep all the child nodes. > > the input xml file looks like..... > > <employees> > <employee> > <uid>ceo</uid> > <manager-uid></manager-uid> > </employee> > <employee> > <uid>vp-1</uid> > <manager-uid>ceo</manager-uid> > </employee> > <employee> > <uid>vp-2</uid> > <manager-uid>ceo</manager-uid> > </employee> > <employee> > <uid>vp-1-secratary</uid> > <manager-uid>vp-1</manager-uid> > </employee> > <employee> > <uid>vp-1-assistant</uid> > <manager-uid>vp-1</manager-uid> > </employee> > <employee> > <uid>vp-1-secratary2</uid> > <manager-uid>vp-1</manager-uid> > </employee> > <employee> > <uid>vp-1-secretary2assistant</uid> > <manager-uid>vp-1-secratary2</manager-uid> > </employee> > <employee> > <uid>vp-2-secretary</uid> > <manager-uid>vp-2</manager-uid> > </employee> > </employees> > -------- > > id like the output to look like.... > > <?xml version="1.0"?> > <nodes> > <node> > <top>ceo</top> > <node> > <bottom>vp-1</bottom> > <node> > <bottom>vp-1-assistant</bottom> > </node> > <node> > <bottom>vp-1-secratary</bottom> > </node> > <node> > <bottom>vp-1-secratary2</bottom> > <node> > <bottom>vp-1-secretary2assistant</bottom> > </node> > </node> > </node> > <node> > <bottom>vp-2</bottom> > <node> > <bottom>vp-2-secretary</bottom> > </node> > </node> > </node> > </nodes> > ------- > > the xslt file im using makes it into a tree but i cant make it do the > full grouping that i want. the xsl file looks like....... > > <?xml version='1.0'?> > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:key name="all-reports" match="employee" use="manager-uid" /> > > <xsl:template match="employees"> > <nodes> > <xsl:for-each select="employee[generate-id() = > generate-id(key('all-reports',manager-uid)[1])]"> > <xsl:sort select="manager-uid" /> > <xsl:if test="not(manager-uid = '')"> > <node> > <top><xsl:value-of select="manager-uid" /></top> > <xsl:for-each select="key('all-reports', manager-uid)"> > <xsl:sort select="uid" /> > <node> > <bottom><xsl:value-of select="uid" /></bottom> > </node> > </xsl:for-each> > </node> > </xsl:if> > </xsl:for-each> > </nodes> > </xsl:template> > </xsl:stylesheet> > > thanks in advance for your help > > > > Steve Lenhart <slenhart@xxxxxxxxxxxx> > Corporate IT Department > Teleflex Incorporated
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] flat xml to full tree with no, Steve Lenhart | Thread | [xsl] remove white space, Mark Williams |
Re: [xsl] remove white space, Wendell Piez | Date | RE: [xsl] remove white space, Lincoln Mitchell |
Month |