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(_at_)yahoo(_dot_)com> 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(_at_)hotmail(_dot_)com> 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(_at_)yahoo(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
_________________________________________________________________
Don?t just search. Find. Check out the new MSN
Search!
http://search.msn.click-url.com/go/onm00200636ave/direct/01/
--~------------------------------------------------------------------
XSL-List info and archive:
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
____________________________________________________
Yahoo! Sports
Rekindle the Rivalries. Sign up for Fantasy Football
http://football.fantasysports.yahoo.com
--~------------------------------------------------------------------
XSL-List info and archive:
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--