There is nothing special about this problem. The following solution verifies that node-list for
<xsl: apply-templates />
not empty before applying templates:
<xsl: stylesheet version = "1.0"
xmlns: xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl: output omit-xml-declaration = "yes" />
<xsl: variable name = "vLevel" select = "0" />
<xsl: template match = "root">
<xsl: variable name = "vnextLevelNodes"
select = "node [@level = $ vLevel + 1]" />
<xsl: if test = "$ vnextLevelNodes">
<ul>
<xsl: apply-templates select = "$ vnextLevelNodes" />
</ul>
</ xsl: if>
</ xsl: template>
<xsl: template match = "node">
<! - the node is either protected, or the user is logged on (no need to check for IsProtected twice) ->
<! - <xsl: if test =
"umbraco.library: IsProtected ($ parent / @ id, $ parent / @ path) = 0
or
umbraco.library: IsLoggedOn () = 1 "> ->
<xsl: if test = "1">
<li>
<! - <a href = "{umbraco.library: NiceUrl (@id)}"> ->
<a href="'umbraco.library:NiceUrl(@id)'">
<xsl: value-of select = "@ nodeName" />
</a>
<xsl: variable name = "vnextLevelNodes"
select = "node [@level = current () / @ level + 1]" />
<xsl: if test = "$ vnextLevelNodes">
<ul>
<xsl: apply-templates select = "$ vnextLevelNodes" />
</ul>
</ xsl: if>
</li>
</ xsl: if>
</ xsl: template>
</ xsl: stylesheet>
I used the following XML source document:
<root id = "- 1">
<node id = "1" level = "1" sortOrder = "1" nodeName = "Page # 1">
<data alias = "umbracoNaviHide"> 0 </data>
</node>
<node id = "2" level = "1" sortOrder = "2" nodeName = "Page # 2">
<data alias = "umbracoNaviHide"> 0 </data>
<node id = "3" level = "2" sortOrder = "2" nodeName = "Subpage # 2.2">
<data alias = "umbracoNaviHide"> 0 </data>
</node>
<node id = "4" level = "2" sortOrder = "1" nodeName = "Subpage # 2.1">
<data alias = "umbracoNaviHide"> 0 </data>
<node id = "5" level = "3" sortOrder = "3" nodeName = "Subpage # 2.1.1">
<data alias = "umbracoNaviHide"> 0 </data>
</node>
</node>
<node id = "6" level = "2" sortOrder = "3" nodeName = "Subpage # 2.3">
<data alias = "umbracoNaviHide"> 1 </data>
</node>
</node>
<node id = "7" level = "1" sortOrder = "3" nodeName = "Page # 3">
<data alias = "umbracoNaviHide"> 1 </data>
</node>
</root>
In addition, I commented on any code referencing the Umbraco extension functions, since I do not have access to them.
When the above conversion is applied to this source XML document, the correct, desired result is obtained:
<ul>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Page # 1 </a>
</li>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Page # 2 </a>
<ul>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Subpage # 2.2 </a>
</li>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Subpage # 2.1 </a>
<ul>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Subpage # 2.1.1 </a>
</li>
</ul>
</li>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Subpage # 2.3 </a>
</li>
</ul>
</li>
<li>
<a href="'umbraco.library:NiceUrl(@id)'"> Page # 3 </a>
</li>
</ul>
Hope this helps.
Greetings
Dimitar Novachev
source share