[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Cascading Menu (with Open/Closed Icons) and displayed

Subject: Cascading Menu (with Open/Closed Icons) and displayed children
From: Brian K Bonner <brian.bonner@xxxxxxxxxxxx>
Date: Thu, 27 Mar 2003 18:57:29 -0500
open close icons
OK,  I've been researching this in the archive and I can't find a match 
and I'm stumped.  I want to create a menu of the sort:

Parameter selected (item 2.1) displays:

C item 1
O item 2
        O item 2.1 *
                C item 2.1.1
                C item 2.1.2
                C item 2.1.3
C item 3
C item 4


Basically, I want to specify a parameter and have it display the cascaded 
menu for me.   I want it to display the menu items at the top level and 
for any item that is selected (e.g. item 2.1 above),  I want it to display 
the open folder for that item and the closed folder for it's children.

The XSL almost works.  I'm able to display the tree, but when the selected 
item has a sibling with children, I get erroneous results.  The selected 
items children plus it's sibling's children shows up in the view.  Can 
anyone point out why?

If you change the param to 1.1, it works fine.  But leaving it at 2.1.1 
gives bad results.  Thanks.


Brian




Here is the XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0" xmlns:xalan="http://xml.apache.org/xslt">
    <xsl:output method="html" indent="yes" />

    <!-- this variable will need to be set by the document -->
    <xsl:param name="selection">Topic 2.1.1</xsl:param>

    <xsl:template match="menu">
        <!-- put all of the items under menu in a table -->
        <!-- remove the html and body tags later... -->
        <html>
            <body>
                <table border="0" cellspacing="0" cellpadding="0">
                    <xsl:apply-templates 
select="//menuItem"></xsl:apply-templates>
                </table>
            </body>
        </html>
    </xsl:template>



    <!-- these are the SELECTED items -->

    <xsl:template match="menuItem[description=$selection]">
        <tr>
            <td>
                <xsl:for-each select="./ancestor::menuItem">
                    <img>
                        <xsl:attribute 
name="src">images/spacer.gif</xsl:attribute>
                    </img>
                </xsl:for-each>
                <a>
                    <xsl:attribute name="href">
                        <xsl:value-of select="url" />
                    </xsl:attribute>

                    <xsl:apply-templates select="imageOpen" />
                    <xsl:apply-templates select="description" />
                </a>
                <xsl:apply-templates select="descendant::menuItem" />

            </td>
        </tr>
    </xsl:template>


    <!-- the ROOT items -->
    <xsl:template match="/menu/menuItem">
        <tr>
            <td>
                <a>
                    <xsl:attribute name="href">
                        <xsl:value-of select="url" />
                    </xsl:attribute>


                    <xsl:choose>
                        <xsl:when 
test="descendant::description=$selection">
                            <xsl:apply-templates select="imageOpen" />
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:apply-templates select="imageBase" />
                        </xsl:otherwise>
                    </xsl:choose>
                    <xsl:apply-templates select="description" />
                </a>
            </td>
        </tr>
    </xsl:template>

    <xsl:template match="menuItem">
        <xsl:if test="descendant::description=$selection">
            <!-- these are the items leading up to the selected item PATH 
-->
            <tr>
                <td>
                    <xsl:for-each select="./ancestor::menuItem">
                        <img>
                            <xsl:attribute 
name="src">images/spacer.gif</xsl:attribute>
                        </img>
                    </xsl:for-each>
                    <a>
                        <xsl:attribute name="href">
                            <xsl:value-of select="url" />
                        </xsl:attribute>
                        <xsl:apply-templates select="imageOpen" />
                        <xsl:apply-templates select="description" />
                    </a>
                </td>
            </tr>
        </xsl:if>
        <xsl:if test="../description=$selection">
            <!-- these items are the CHILDREN of the selected item -->
            <tr>
                <td>
                    <xsl:for-each select="./ancestor::menuItem">
                        <img>
                            <xsl:attribute 
name="src">images/spacer.gif</xsl:attribute>
                        </img>
                    </xsl:for-each>
                    <a>
                        <xsl:attribute name="href">
                            <xsl:value-of select="url" />
                        </xsl:attribute>
                        <xsl:apply-templates select="imageBase" />
                        <xsl:apply-templates select="description" />
                    </a>
                </td>
            </tr>
        </xsl:if>
    </xsl:template>

    <xsl:template match="imageBase">
        <img>
            <xsl:attribute name="src">
                <xsl:text />
                <xsl:value-of select="." />
            </xsl:attribute>
            <xsl:attribute name="border">0</xsl:attribute>
        </img>

    </xsl:template>

    <xsl:template match="imageOpen">
        <img>
            <xsl:attribute name="src">
                <xsl:text />
                <xsl:value-of select="." />
            </xsl:attribute>
            <xsl:attribute name="border">0</xsl:attribute>
        </img>

    </xsl:template>


    <xsl:template match="description">
        <xsl:value-of select="." />
    </xsl:template>


</xsl:stylesheet>



here is the sample data.


<?xml version="1.0"?>
<menu>
    <menuItem id="docid1">
        <description>Topic 1</description>
        <imageBase>images/closed.gif</imageBase>
        <imageOpen>images/open.gif</imageOpen>
        <url>http://test.com</url>

        <menuItem id="docid2">
            <description>Topic 1.1</description>
            <imageBase>images/closed.gif</imageBase>
            <imageOpen>images/open.gif</imageOpen>
                <url>http://test.com</url>
        </menuItem>
        <menuItem id="docid3">
            <description>Topic 1.2</description>
            <imageBase>images/closed.gif</imageBase>
            <imageOpen>images/open.gif</imageOpen>
        </menuItem>
    </menuItem>
    <menuItem id="docid4">
        <description>Topic 2</description>
        <imageBase>images/closed.gif</imageBase>
        <imageOpen>images/open.gif</imageOpen>
        <menuItem id="docid5">
            <description>Topic 2.1</description>
            <imageBase>images/closed.gif</imageBase>
            <imageOpen>images/open.gif</imageOpen>
            <menuItem id="docid2">
                <description>Topic 2.1.1</description>
                <imageBase>images/closed.gif</imageBase>
                <imageOpen>images/open.gif</imageOpen>
                <menuItem id="docid2">
                    <description>Topic 2.1.1.1</description>
                    <imageBase>images/closed.gif</imageBase>
                    <imageOpen>images/open.gif</imageOpen>
                </menuItem>
                <menuItem id="docid3">
                    <description>Topic 2.1.1.2</description>
                    <imageBase>images/closed.gif</imageBase>
                    <imageOpen>images/open.gif</imageOpen>
                </menuItem>

            </menuItem>
            <menuItem id="docid3">
                <description>Topic 2.1.2</description>
                <imageBase>images/closed.gif</imageBase>
                <imageOpen>images/open.gif</imageOpen>
                <menuItem id="docid2">
                    <description>Topic 2.1.2.1</description>
                    <imageBase>images/closed.gif</imageBase>
                    <imageOpen>images/open.gif</imageOpen>
                </menuItem>
                <menuItem id="docid3">
                    <description>Topic 2.1.2.2</description>
                    <imageBase>images/closed.gif</imageBase>
                    <imageOpen>images/open.gif</imageOpen>
                </menuItem>

            </menuItem>
        </menuItem>
        <menuItem id="docid6">
            <description>Topic 2.2</description>
            <imageBase>images/closed.gif</imageBase>
            <imageOpen>images/open.gif</imageOpen>
        </menuItem>
    </menuItem>
    <menuItem id="docid7">
        <description>Topic 3</description>
        <imageBase>images/closed.gif</imageBase>
        <imageOpen>images/open.gif</imageOpen>
        <menuItem id="docid8">
            <description>Topic 3.1</description>
            <imageBase>images/closed.gif</imageBase>
            <imageOpen>images/open.gif</imageOpen>
        </menuItem>
        <menuItem id="docid9">
            <description>Topic 3.2</description>
            <imageBase>images/closed.gif</imageBase>
            <imageOpen>images/open.gif</imageOpen>
        </menuItem>
    </menuItem>
</menu>

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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.