Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 12:41
    Sajid Riaz
    0

    building a sub menu by page version 4.5

    Hello everyone.

    I'm building a basic navigation.

    my structure is as follows:

    Home

         About

             Interests

             Skills

        Gallery

            Work

             Sports

     

     

    what I want to is show the sub pages of About and Gallery.  My xslt is shown below.

    this works, but i'm building the subpages with this check : xsl:if test="$currentPage/@nodeName != 'Home">

    is this the best way to check that the user is not currently on home page.  ie, if there on home page dont bother showing sub pages.

    <xsl:template match="/">
    <xsl:if test="$currentPage/@nodeName != 'Home">
    <!-- The fun starts here -->
    <ul class="nav">
    <xsl:for-each select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1']">
      <li>
        <a href="{umbraco.library:NiceUrl(@id)}">
          <xsl:value-of select="@nodeName"/>
        </a>
      </li>
    </xsl:for-each>
    </ul>
    </xsl:if>
    </xsl:template>

     

  • Peter Holmsgaard 69 posts 106 karma points
    Jul 17, 2010 @ 13:18
    Peter Holmsgaard
    1

    As for your posted example, it seems that your missin a ' in your xsl:if statement..

    It think it should look like this: <xsl:if test="$currentPage/@nodeName != 'Home'"> (don't know if this RTE removed some formatting when you pasted it).

    If you only want the navigation to be shown, when you are at a lvl2 page, you could also write it like this:

    <xsl:if test="$currentPage/@level='2'">
        <xsl:for-each select="$currentPage/*[@isDoc and string(umbracoNavihide) != '1']">
            <xsl:value-of select="@nodeName"/>
        </xsl:for-each>
    </xsl:if>

    Let me know if it works, haven't tested it:)

    /Peter

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 13:43
    Sajid Riaz
    0

    Peter, thanks your example above works and is better ....

     

    I am building a forloop but only want it to fire if the node in question has sub nodes.

    do you know how i can do this?

     

    >sajid

  • Hendrik Jan 71 posts 137 karma points
    Jul 17, 2010 @ 13:58
    Hendrik Jan
    0

    Hey Sajid,

    Have you tried taking a look on the XSLT templates that are in umbraco by default?
    I think the sitemap template is what youre looking for.

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 14:10
    Sajid Riaz
    0

    Hi Neils, please talking again.

    my scenario is as follows:

    my structure:

    Home

          About

             Skills

             Interests

                  Pigeon Shooting

        Gallery

            Sports

                 Footbal

                  Tennis

            Holidays

                Italy

     

    do i have up to 4 sub levels and user could add more

    i want to be to create a menu to cater for this.

    due to lack of knowledge on xslt...i've built 3 xslt files.  file gets top nav, file 3 gets level 2 nav  file3 gets level 3 nav but level2 dissapears as the current page is no longer level 2.

    this menu will go on top of master page.

    still working on this....any help much appreciated.

    >sajid

     

     

     

     

  • Peter Holmsgaard 69 posts 106 karma points
    Jul 17, 2010 @ 14:10
    Peter Holmsgaard
    0

    Perhaps you can add a count in your for-each that checks if the current node has some descendants..

    try:

    <xsl:for-each select="$currentPage/*[@isDoc and string(umbracoNavihide) != '1' and count(./* [@isDoc]) &gt; 0]">

    Again, haven't tested :)

    /Peter

  • Peter Holmsgaard 69 posts 106 karma points
    Jul 17, 2010 @ 14:21
    Peter Holmsgaard
    0

    Ah, didn't see your last post, as I was writing a response myself :)

    So you only wan't pages of the same level as the current page to be shown?

    /Peter

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 14:46
    Sajid Riaz
    0

    hi Peter,  show current page and its menu if has parent show that if has child show that too.

     

    >sajid

  • Hendrik Jan 71 posts 137 karma points
    Jul 17, 2010 @ 17:07
    Hendrik Jan
    1

    Hey Sajid,
    Do you want the home item to display at the same level as his children?

    I have a xslt script here that displays the tree to the current page and his subpages. And it wil go as deep as you need.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet 
      version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:msxml="urn:schemas-microsoft-com:xslt" 
      xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" xmlns:umbraco.contour="urn:umbraco.contour" 
      exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets umbraco.contour ">
    
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    
    
    <xsl:param name="currentPage"/>
    <xsl:template match="/">
    <ul>
      <!-- draw the home node at level 1 . ignore children -->
      <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=1][@isDoc and string(umbracoNaviHide) != '1']">
        <li>
          <a href="{umbraco.library:NiceUrl(@id)}">
            <xsl:value-of select="@nodeName"/>
          </a>
        </li>
      </xsl:for-each>
    
      <!-- for each menu item at level 2 -->
      <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=1]/*[@isDoc and string(umbracoNaviHide) != '1']">
        <li>
          <a href="{umbraco.library:NiceUrl(@id)}">
            <xsl:value-of select="@nodeName"/>
          </a>
          <!-- Create a submenu if this page or an child page is active-->
          <xsl:if test="./@id = $currentPage/@id or contains($currentPage/@path, concat(',',./@id))">
            <xsl:call-template name="drawNodes">  
              <xsl:with-param name="parent" select="."/>  
            </xsl:call-template>
          </xsl:if>
        </li>
      </xsl:for-each>
    </ul>
    </xsl:template>
    
    <!-- draw submenu's -->
    <xsl:template name="drawNodes">
      <xsl:param name="parent"/> 
      <ul>
        <xsl:for-each select="$parent/* [@isDoc and string(umbracoNaviHide) != '1']"> 
          <li>  
            <a href="{umbraco.library:NiceUrl(@id)}">
              <xsl:value-of select="@nodeName"/>
            </a>  
            <xsl:if test="./@id = $currentPage/@id or contains($currentPage/@path, concat(',',./@id))">   
              <xsl:call-template name="drawNodes">    
                <xsl:with-param name="parent" select="."/>    
              </xsl:call-template>  
            </xsl:if> 
          </li>
        </xsl:for-each>
      </ul>
    </xsl:template>
    
    </xsl:stylesheet>

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 19:33
    Sajid Riaz
    0

    Neils,

    Amazing THANKYOU!!!!!   it works perfectly...

    i cannot something very basic working.  and that is to display the xml nodes on the page so i can debug whats going on.

    below I've pasted an image gallery xslt in ver4.5:

    when i do   <xsl:copy-of select="$mediaItems"/> should i expect to see the structure below $mediaItems as i defined this parameter below?

     

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxml="urn:schemas-microsoft-com:xslt"
      xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets"
      exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets ">


    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:param name="currentPage"/>
    <xsl:variable name="imageRoot" select="$currentPage/gallery"/>
        
    <xsl:template match="/">

    <!-- start writing XSLT -->
     
     
    <xsl:variable name="mediaItems" select="umbraco.library:GetMedia($imageRoot, true())"/>

      <xsl:for-each select="$mediaItems/Folder/Image">
        
     
      <xsl:variable name="picFile" select="umbracoFile"/>
        <xsl:variable name="picW" select="umbracoWidth"/>
        <xsl:variable name="picH" select="umbracoHeight"/>
          <img>
              <xsl:attribute name="src"><xsl:value-of select="$picFile"/></xsl:attribute>  
          </img>
    </xsl:for-each>


    </xsl:template>

    </xsl:stylesheet>

     

     

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 19:45
    Sajid Riaz
    0

    Neils,

    this is my structure using the xslt you kindly  posted above:

    home

    about

             skills

             sports

    Gallery

     

    ,when i click on skills then menu changes to:

     

    home

    about

             skills

                      sports

              Gallery

     

     

    skills has no children.  but the other 2 node have gone down a level

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 20:02
    Sajid Riaz
    0

    Neils,

     

    when u click on a node with no children, somewhere an empty ul is being written by the xslt producing <ul />, thus moving everything to the left .

     

    looking into the xslt.

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 20:21
    Sajid Riaz
    0

    Neils, I tried to update your xslt to:

     

      <!-- Create a submenu if this page or an child page is active-->
          <xsl:if test="./@id = $currentPage/@id or contains($currentPage/@path, concat(',',./@id))">
          
            <xsl:variable name="children" select="umbraco.library:GetXmlNodeById($currentPage/@id)/node"/>
                <xsl:if test="count($children) > 0">

            <xsl:call-template name="drawNodes">  
              <xsl:with-param name="parent" select="."/>  
            </xsl:call-template>
             </xsl:if>
          </xsl:if>

    I'm trying to check if the node has children the drawNodes.   but the count is always 0...

     

    >sajid

  • Sajid Riaz 142 posts 165 karma points
    Jul 17, 2010 @ 20:57
    Sajid Riaz
    0

    Hi Neils fixed the problem i noted above:  Here' your original xslt with added if statement in bold.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxml="urn:schemas-microsoft-com:xslt"
      xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" xmlns:umbraco.contour="urn:umbraco.contour"
      exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets umbraco.contour ">

    <xsl:output method="xml" omit-xml-declaration="yes"/>


    <xsl:param name="currentPage"/>
    <xsl:template match="/">
    <ul>
      <!-- draw the home node at level 1 . ignore children -->
      <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=1][@isDoc and string(umbracoNaviHide) != '1']">
        <li>
          <a href="{umbraco.library:NiceUrl(@id)}">
            <xsl:value-of select="@nodeName"/>
          </a>
        </li>
      </xsl:for-each>

      <!-- for each menu item at level 2 -->
      <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=1]/*[@isDoc and string(umbracoNaviHide) != '1']">
        <li>
          <a href="{umbraco.library:NiceUrl(@id)}">
            <xsl:value-of select="@nodeName"/>
          </a>
          <!-- Create a submenu if this page or an child page is active-->
          <xsl:if test="./@id = $currentPage/@id or contains($currentPage/@path, concat(',',./@id))">
        
            
            <xsl:call-template name="drawNodes">  
              <xsl:with-param name="parent" select="."/>  
            </xsl:call-template>
             
          </xsl:if>
        </li>
      </xsl:for-each>
    </ul>
    </xsl:template>

    <!-- draw submenu's -->
    <xsl:template name="drawNodes">
      <xsl:param name="parent"/>
    <xsl:if test="$parent/* [@isDoc and string(umbracoNaviHide) != '1']">  
     
      <ul>
        <xsl:for-each select="$parent/* [@isDoc and string(umbracoNaviHide) != '1']">
          <li>  
            <a href="{umbraco.library:NiceUrl(@id)}">
              <xsl:value-of select="@nodeName"/>
            </a>  
            <xsl:if test="./@id = $currentPage/@id or contains($currentPage/@path, concat(',',./@id))">   
         
              <xsl:call-template name="drawNodes">    
                <xsl:with-param name="parent" select="."/>    
              </xsl:call-template>  
             
            </xsl:if>
          </li>
        </xsl:for-each>
      </ul>
           </xsl:if>
    </xsl:template>

    </xsl:stylesheet>

  • Hendrik Jan 71 posts 137 karma points
    Jul 18, 2010 @ 18:08
    Hendrik Jan
    1

    Ah cool, thanks for the fix! Good job :)

Please Sign in or register to post replies

Write your reply to:

Draft