Jump to content

Test for Root Parent Nodes Without Children


svoltmer

Recommended Posts

I am trying to apply <href> links to only top root nodes of my tab navigation by testing for if they have child nodes. If they have children they should not get a link assigned to them, but I want all subsuquent parents (those in nested <ul> that have children) to have links. Here is the location of my test page: https://edit-www.rose-hulman.edu/offices-services/alumni-affairs-2.aspx You can see from the first tab dropdown the problem I am having. Under "Alumni Affairs", which has no link assigned to it, as it shouldn't, there is "Young Alumni Counsel" . This node needs to have a link assigned to it, but it won't ever get one because the xslt "choose" is not restrictive to the" / " node but applies to all the child nodes as well. So if I need to add any other nodes under any of child nodes they will no longer link to a page because they are now parents. Thanks for all your help. I am using the CMS Umbraco and ver. 1.0 xml. Here is my xslt: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]><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:template match="/"> <xsl:variable name="home" select="$currentPage/ancestor-or-self::Category2HomePage" /> <xsl:variable name="nav" select="$home/*[@isDoc and string(umbracoNaviHide)!=1]" /> <ul> <xsl:if test="string($home/useAlternateNavigation) = '1'"> <xsl:attribute name="class">alt-nav</xsl:attribute> </xsl:if> <xsl:for-each select="$nav"> <li> <!-- this craziness allows IE to lay subnavs on top of top nav elements if they break onto two lines --> <xsl:attribute name="style">z-index:<xsl:value-of select="count($nav)-position()+1" />;</xsl:attribute> <xsl:attribute name="class"> <xsl:if test="$currentPage/ancestor-or-self::*[@isDoc and name()!='Category2HomePage' and @id=current()/@id]"> <xsl:text>active</xsl:text> </xsl:if> <xsl:text> </xsl:text> <xsl:if test="count($nav)=position()"> <xsl:text>last</xsl:text> </xsl:if> </xsl:attribute> <xsl:call-template name="node-link-with-span"> <xsl:with-param name="node" select="current()" /> </xsl:call-template> <xsl:variable name="subnodes" select="* [@isDoc and string(umbracoNaviHide)!=1]" /> <xsl:if test="$subnodes"> <ul> <xsl:for-each select="$subnodes"> <li> <xsl:if test="position()=1"> <xsl:attribute name="class">first</xsl:attribute> </xsl:if> <xsl:call-template name="node-link-with-span"> <xsl:with-param name="node" select="current()" /> </xsl:call-template> </li> </xsl:for-each> </ul> </xsl:if> </li> </xsl:for-each> </ul> <xsl:if test="string($home/useAlternateNavigation) != '1'"> <img src="/static/phase2/tabNavBorderBottom.jpg" class="tabBorder" /> </xsl:if></xsl:template> <xsl:template name="node-link-with-span"> <xsl:param name="node" /> <xsl:if test="string($node) != ''"> <a> <xsl:attribute name="href"> <xsl:choose> <!--HERE IS THE PROBLEM TEST --> <xsl:when test="count($node/* [@isDoc and string(umbracoNaviHide) != '1'])"> <xsl:text>javascript://</xsl:text> </xsl:when> <xsl:when test="$node[name() = 'ExternalLink']"> <xsl:value-of select="$node/url" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="umbraco.library:NiceUrl($node/@id)" /> </xsl:otherwise> </xsl:choose> </xsl:attribute> <span> <xsl:call-template name="node-name"> <xsl:with-param name="node" select="$node" /> </xsl:call-template> </span> </a> </xsl:if></xsl:template> <!-- A template to output the correct name for a given node. Better than copy/pasting this code all over the place --><xsl:template name="node-name"> <xsl:param name="node" /> <xsl:if test="string($node) != ''"> <xsl:choose> <xsl:when test="$node/pageTitle != ''"> <xsl:value-of select="$node/pageTitle"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$node/@nodeName"/> </xsl:otherwise> </xsl:choose> </xsl:if></xsl:template></xsl:stylesheet>

Link to comment
Share on other sites

Instead of calling templates, try matching them.Something like (pseudo code):

<xsl:template match="/|inner-list"><ul><xsl:apply-templates select="list-links" /></ul></xsl:template><xsl:template match="list-links[inner-list]"><li>    <xsl:value-of select="link-label" />    <xsl:apply-templates select="inner-list" /></li></xsl:template><xsl:template match="list-links[not(inner-list)]"><li>    <a href="{link}"><xsl:value-of select="link-label" /></a></li></xsl:template>

Link to comment
Share on other sites

Those were just pseudo names, used to illustrate the point. The real names need to correspond to whatever the nodes in your XML are. Your XSLT doesn't give me any hint as to how the XML looks, which is why I used those pseudo names instead.The general idea is that in the XML, you have nested elements, and you only want links on the inner most ones. This XSLT creates a "ul" for each level, and a "li" for each item at that level. When at the most inner level, a link is also created.How does your XML look like? What qualifies a node as "the inner most item" vs. "an item, but not the inner most one"?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...