|
Subject: RE: [xsl] Can't identify last ancestor node From: Mat Bergman <matbergman@xxxxxxxxx> Date: Tue, 28 Jun 2005 09:20:23 -0700 (PDT) |
This is close to what I need, but I need to be more
clear. In this case, the context node is
/menudata/menu/menu. I want to apply unique output for
the last <menu> nodes in /menudata/menu/menu. For
instance:
<menudata>
<menu name="link1">
<menu name="link1a"/>
<menu name="link1b"/>
<menu name="link1c"/>
</menu>
<menu name="link2">
<menu name="link2a"/>
<menu name="link2b"/>
<menu name="link2c"/>
</menu>
</menudata>
The <menu> nodes with name="link1c" and name="link2c"
are the nodes that I'm after, but I can't figure out
how to identify those nodes with XPath.
Working with <xsl:variable name="last-menu"
select="(//menu)[last()]"/> gives me the last <menu>
node in the entire nodeset, so that my custom output
is applied only to name="link2c". So maybe [last()] is
not the predicate that I need.
Thanks for bearing with me,
-Mat
--- Michael Kay <mike@xxxxxxxxxxxx> wrote:
> You haven't told us what the context node is for
> your code snippets -
> presumably it's the <menu> element that you're
> testing? In that case they
> don't make any sense at all. Looking at the
> ancestors of a node can't tell
> you whether it has any following siblings, for
> example. (From your question,
> I think you may have confused your ancestors with
> your descendants).
>
> Best way to do this is probably to set a global
> variable to the last menu
> element:
>
> <xsl:variable name="last-menu"
> select="(//menu)[last()]"/>
>
> and then when processing each menu element, test
>
> <xsl:if test=". is $last-menu"> (XSLT 2.0)
>
> <xsl:if test="generate-id(.) =
> generate-id($last-menu)"/> (XSLT 1.0)
>
> Michael Kay
> http://www.saxonica.com/
>
>
> > -----Original Message-----
> > From: Mat Bergman [mailto:matbergman@xxxxxxxxx]
> > Sent: 28 June 2005 09:36
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] Can't identify last ancestor node
> >
> > Using this XML data:
> >
> > <menudata>
> > <menu name="link1"/>
> > <menu name="link2">
> > <menu name="link2a"/>
> > <menu name="link2b"/>
> > </menu>
> > </menudata>
> >
> >
> > I am producing this HTML output:
> > <ul>
> > <li>link1</li>
> > <li>link2
> > <ul>
> > <li>link2a</li>
> > <li>link2b</li>
> > </ul>
> > </li>
> > </ul>
> >
> > I am using a convoluted stylesheet that tokenizes
> an
> > attribute and generates the HTML output based on
> the
> > attribute's value. My problem is identifying the
> last
> > nested node, in this example "link2b", so that I
> can
> > customize that node's output.
> >
> > My complete stylesheet is below, but to summarize
> I
> > made two attempts:
> >
> > <xsl:for-each select="ancestor::menu">
> > <xsl:if test="position()=last()">
> > <xsl:text>Write custom end text here</xsl:text>
> > </xsl:if>
> > </xsl:for-each>
> >
> > and
> >
> > <xsl:if test="ancestor::menu[last()]">
> > <xsl:text>Write custom end tag here</xsl:text>
> > </xsl:if>
> >
> > Both attempts wrote to each individual node, not
> just
> > the last one. How can I tell my stylesheet to
> write
> > one thing for the last <menu> node, and something
> else
> > for the rest?
> >
> > Here's the entire stylesheet:
> >
> > <?xml version="1.0"?>
> > <xsl:stylesheet version="1.0"
> >
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> >
> > <xsl:output method="html" indent="yes"/>
> >
> > <!-- siteID determines if a link is displayed for
> a
> > specific cobrand -->
> > <xsl:param name="siteID" select="2"/>
> >
> > <!-- Displays navigation -->
> > <xsl:template match="/">
> >
> > <ul>
> >
> > <!-- tokenize all <menu> nodes -->
> > <xsl:for-each select="//menu">
> >
> > <!-- Tokenize attributes to check if siteID is
> > excluded -->
> > <xsl:call-template name="tokenize">
> > <xsl:with-param name="string"
> > select="@exsites"/>
> > <xsl:with-param name="delimiters"
> select="','"/>
> > <xsl:with-param name="level"
> > select="'process-includeExclude'"/>
> > </xsl:call-template>
> >
> > </xsl:for-each>
> >
> > </ul>
> >
> > </xsl:template>
> >
> >
> > <!-- Extract individual values from
> comma-delimited
> > attribute -->
> > <xsl:template name="tokenize">
> > <xsl:param name="string" select="''" />
> > <xsl:param name="delimiters" select="'
>
'"
> > />
> > <xsl:param name="level" select="''" />
> >
> > <xsl:call-template name="_tokenize-delimiters">
> > <xsl:with-param name="string" select="$string"
> />
> > <xsl:with-param name="delimiters"
> > select="$delimiters" />
> > <xsl:with-param name="level" select="$level" />
> > </xsl:call-template>
> >
> > </xsl:template>
> >
> >
> > <xsl:template name="_tokenize-delimiters">
> >
> > <xsl:param name="string" />
> > <xsl:param name="delimiters" />
> >
> > <xsl:param name="level" />
> >
> > <xsl:param name="last-delimit"/>
> > <xsl:variable name="delimiter"
> > select="substring($delimiters, 1, 1)" />
> >
> > <xsl:choose>
> > <xsl:when test="not($delimiter)">
> >
> > <!-- Sends individual attribute value for
> processing
> > -->
> > <xsl:call-template name="process-includeExclude"
> >
> > <xsl:with-param
> > name="currentExsite"><xsl:value-of
> > select="$string"/></xsl:with-param>
> > </xsl:call-template>
> >
> > </xsl:when>
> >
> > <!-- process string until all tokens are
> separated
> > -->
> > <xsl:when test="contains($string, $delimiter)">
> > <xsl:if test="not(starts-with($string,
> > $delimiter))">
> > <xsl:call-template
> name="_tokenize-delimiters">
> > <xsl:with-param name="string"
> > select="substring-before($string, $delimiter)" />
> > <xsl:with-param name="delimiters"
> > select="substring($delimiters, 2)" />
> > <xsl:with-param name="level"
> select="$level" />
> >
> > </xsl:call-template>
> > </xsl:if>
> > <xsl:call-template
> name="_tokenize-delimiters">
> > <xsl:with-param name="string"
> > select="substring-after($string, $delimiter)" />
> > <xsl:with-param name="delimiters"
> > select="$delimiters" />
>
=== message truncated ===
__________________________________________________
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] Can't identify last ances, Sam D. Chuparkoff | Thread | RE: [xsl] Can't identify last ances, Michael Kay |
| RE: [xsl] xsl transform, Philippe LAPLANCHE | Date | RE: [xsl] Can't identify last ances, Michael Kay |
| Month |