xsl-list
[Top] [All Lists]

Re: Bread-crumbs nav from nested hierarchy in reverse order

2003-08-18 23:55:36
I can suggest to use ancestor-or-self axis here. Also
I tried to simplify the code and make it more
readable:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:param name="pageid" select="3"/>

        <xsl:template match="/">
                <xsl:variable name="selected-page"
select="//page[pageid = $pageid]"/>
                <xsl:variable name="selected-page-path"
select="$selected-page/ancestor-or-self::page"/>
                <docroot>
                        <xsl:call-template name="reverse">
                                <xsl:with-param name="node-set"
select="$selected-page-path"/>
                        </xsl:call-template>
                </docroot>      
        </xsl:template>
        
        <xsl:template name="reverse">
                <xsl:param name="node-set"/>
                <xsl:if test="$node-set">
                        <xsl:variable name="current-item"
select="$node-set[last()]"/>
                        <a
href="index.cfm?pageid={$current-item/pageid}"><xsl:value-of
select="normalize-space($current-item/title)"/></a>
                        <xsl:if test="(count($node-set) &gt; 1) and
($node-set[last() - 1]/pageid)">
                                &gt;&gt;
                                <xsl:call-template name="reverse">
                                        <xsl:with-param name="node-set"
select="$node-set[position() &lt; last()]"/>
                                </xsl:call-template>                            
        
                        </xsl:if>
                </xsl:if>
        </xsl:template>
</xsl:stylesheet>

The stylesheet doesn't output extra ">>" at the start
of the path.

Regards,
Armen

--- "Simerman, Joshua Michael" <jsimerma(_at_)indiana(_dot_)edu>
wrote:
I'm trying to create bread-crumbing for the
navigation of a website. I
have the site hierarchy in a forwards nested
document like below. The
only way I could figure out how to get the bread
crumbs at all was to
get a backwards result. Once I have the result doc,
I dump it as a
srting to the browser. Got any ideas of a simple way
to reverse the
order in xsl, or a better way to write my first xsl?

Here's how my xml document is formed.

<page>
      <title>Home Page<title>
      <pageid>1</pageid>
      <page>
              <title>Parent Page</title>
              <pageid>2</pageid>
              <page>
                      <title>This Page</title>
                      <pageid>3</pageid>
              </page>
      <page>
</page>

Here's the xslt I wrote up.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" version="1.0"
encoding="UTF-8" indent="yes"/>
      <xsl:param name="pageid" select="23"/>
      <xsl:template match="/">
              <docroot>
                      <xsl:apply-templates mode="first"/>
              </docroot>
      </xsl:template>
      <xsl:template match="node()" mode="first">
              <xsl:apply-templates select="page" mode="first"/>
              <xsl:if test="pageid=$pageid">
                      <xsl:call-template name="bread-crumb"/>
              </xsl:if>
      </xsl:template>
      <xsl:template match="node()" mode="ancestor">
              <xsl:call-template name="bread-crumb"/>
      </xsl:template>
      <xsl:template name="bread-crumb">
              <xsl:text>&gt;&gt;</xsl:text>
              <xsl:element name="a">
                      <xsl:attribute
name="href">index.cfm?pageid=<xsl:value-of
select="pageid"/></xsl:attribute>
                      <xsl:value-of
select="normalize-space(pagetitle)"/>
              </xsl:element>
              <xsl:if test="../pageid">
                      <xsl:apply-templates select=".."
mode="ancestor"/>
              </xsl:if>
      </xsl:template>
</xsl:stylesheet>

This is what I end up with.

<?xml version="1.0" encoding="UTF-8"?>
<docroot>
      <a href="index.cfm?pageid=23">Laptop
Requirements</a>
      <a href="index.cfm?pageid=21">Computing</a>
      <a href="index.cfm?pageid=20">Once you're
admitted</a>
      <a href="index.cfm?pageid=1">Admissions</a>
</docroot>

Here's the browser view.

Laptop Requirements>>Computing>>Once you're
admitted>>Admissions



Josh Simerman
Graduate Assistant, Web Developer
Systems & Accounting Graduate Programs
Indiana University, Kelley School of Business


 XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list



__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>