Subject: RE: 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: 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
|