Subject: RE: [xsl] Identify last node in nested nodeset with same name From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx> Date: Fri, 24 Jun 2005 09:47:35 -0700 (PDT) |
Hello Mat, My objective was to get my feets wet with your problem :) I am glad myself and Aron were able to help you ;) Regards, Mukul --- Mat Bergman <matbergman@xxxxxxxxx> wrote: > Hi Aron and Mukul, > > Thanks for your elegant solutions. I'll use them to > finish my project. > > I should have mentioned that my client's requirement > is to not modify the XML they delivered. However, > this requirement has lead to some serious > compromises, > and it's clear that your solutions are the most > elegant. > > -Mat > > --- Aron Bock <aronbock@xxxxxxxxxxx> wrote: > > > Mat, > > > > Luckily, there's an easier and more "natural" way > to > > do this -- don't write > > "tags", as you do, but create full-fledged > elements. > > Using this, with > > recursion, yields a simple approach. > > > > With this input: > > > > <data> > > <menu name="link1"/> > > <menu name="link2"> > > <menu name="link2a"/> > > <menu name="link2b"/> > > </menu> > > </data> > > > > This transform, using call-template: > > > > <?xml version="1.0" encoding="iso8859-1"?> > > <xsl:stylesheet version="1.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > <xsl:output method="xml" indent="yes"/> > > <xsl:strip-space elements="*"/> > > > > <xsl:template match="/data"> > > <xsl:call-template name="write-menu"> > > <xsl:with-param name="items" > > select="menu"/> > > </xsl:call-template> > > > > </xsl:template> > > > > <xsl:template name="write-menu"> > > <xsl:param name="items" select="/.."/> > > <ul> > > <xsl:for-each select="$items"> > > <li> > > <xsl:value-of select="@name"/> > > <xsl:if test="menu"> > > <xsl:call-template > > name="write-menu"> > > <xsl:with-param > > name="items" select="menu"/> > > </xsl:call-template> > > </xsl:if> > > </li> > > </xsl:for-each> > > </ul> > > </xsl:template> > > </xsl:stylesheet> > > > > > > Produces: > > > > <?xml version="1.0" encoding="UTF-8"?> > > <ul> > > <li>link1</li> > > <li>link2<ul> > > <li>link2a</li> > > <li>link2b</li> > > </ul> > > </li> > > </ul> > > > > > > As an aside, if iterating over a set of nodes, > > last() in a test can identify > > the last node. > > > > Regards, > > > > --A > > > > > > > > > > >From: Mat Bergman <matbergman@xxxxxxxxx> > > >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > > >To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > > >Subject: [xsl] Identify last node in nested > nodeset > > with same name > > >Date: Thu, 23 Jun 2005 19:26:19 -0700 (PDT) > > > > > >I am working with XML data that shares the same > > >element name for each node set, for example: > > > > > ><menu name="link1"/> > > ><menu name="link2"> > > > <menu name="link2a"/> > > > <menu name="link2b"/> > > ></menu> > > > > > >My XSL stylesheet transforms this into an HTML > > >unordered list, like this: > > ><ul> > > ><li>link1</li> > > ><li>link2 > > > <ul> > > > <li>link2a</li> > > > <li>link2b</li> > > > </ul> > > ></li> > > ></ul> > > > > > >I can't figure out how to identify the last > > >second-tier node (in this example "link2b") so > that > > >the stylesheet can write the closing </ul> tag > for > > the > > >nested list. I thought I would reference it with > > >something like <xsl:if > test="/menu/menu[last()]">, > > but > > >my XPath must be incorrect because it fails. > > > > > >I am currently writing the opening <ul> and > closing > > ></li> tags for the nested list with this: > > > > > ><xsl:template match="menu"> > > ><xsl:if test="count(menu)>0"> > > ><xsl:text><ul></xsl:text> > > ></xsl:if> > > > > > ><xsl:if test="count(menu)=0"> > > ><xsl:text></li></xsl:text> > > ></xsl:if> > > ></xsl:template> > > > > > >If I only knew how to identify the last node in > > >/menu/menu, I could easily write the closing tag. > > > > > >Thanks, > > > > > >-Mat > > > > > _________________________________________________________________ > > Dont just search. Find. Check out the new MSN > > Search! > > > http://search.msn.click-url.com/go/onm00200636ave/direct/01/ > > > > > > > > > ____________________________________________________ > > Yahoo! Sports > Rekindle the Rivalries. Sign up for Fantasy Football > > http://football.fantasysports.yahoo.com > > __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Identify last node in nes, Mat Bergman | Thread | Re: [xsl] Identify last node in nes, Mukul Gandhi |
RE: [xsl] Identify last node in nes, Mat Bergman | Date | Re: [xsl] Counting preceding nodes, Mukul Gandhi |
Month |