xsl-list
[Top] [All Lists]

RE: Identify last node in nested nodeset with same name

2005-06-24 09:40:08
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>&lt;ul&gt;</xsl:text>
</xsl:if>

<xsl:if test="count(menu)=0">
<xsl:text>&lt;/li&gt;</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>
--~--