如何关闭显示Umbraco CMS中所选主菜单项的子项?

时间:2014-01-06 09:14:54

标签: umbraco

为了更方便地解释我的问题,请先看这张照片

enter image description here

在我的模板上,我已经配置了顶级导航,但问题是我正在尝试制作新的菜单项,这将被称为“新闻”,而事实是我不希望99个新闻中的每一个都会发布(在接下来的两个月内),作为“新闻”下的sumbenu子项目自动提供。

正如我所注意到的,大部分配置都在'umbTopNavigation.xslt'下

]> 
 xmlns:msxml="urn:schemas-microsoft-com:xslt"
 xmlns:umbraco.library="urn:umbraco.library"
 exclude-result-prefixes="msxml umbraco.library">
<xsl:output method="xml" omit-xml-declaration="yes" />

<xsl:param name="currentPage"/>

<!-- Input the documenttype you want here -->
<xsl:variable name="level" select="1"/>

<xsl:template match="/">

    <ul id="topNavigation">
   <li class="home">
     <xsl:if test="$currentPage/@id = $currentPage/ancestor-or-self::* [@level=$level]/@id">
         <xsl:attribute name="class">home current</xsl:attribute>
     </xsl:if>
     <a href="/">Home</a>
   </li>
  <xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">   <li>
 <xsl:if test="@id = $currentPage/@id">
    <xsl:attribute name="class">current</xsl:attribute>
  </xsl:if>
<a class="navigation" href="{umbraco.library:NiceUrl(@id)}">
  <span><xsl:value-of select="@nodeName"/></span>
</a>   </li>
  </xsl:for-each> </ul>

</xsl:template>

但我无法弄清楚到底需要改变什么? 任何帮助表示赞赏,并提前多多感谢! MC2012 第一个宏

<?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"
  exclude-result-prefixes="msxml umbraco.library">

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

<xsl:param name="currentPage"/>

<xsl:template match="/">

  <xsl:variable name="items" select="$currentPage/ancestor-or-self::* [@isDoc and @level = 2]/* [@isDoc and string(umbracoNaviHide) != '1']"/>

<!-- The fun starts here -->

<xsl:if test="count($items) &gt; 0">
<ul>
<xsl:for-each select="$items">
  <li>
    <a href="{umbraco.library:NiceUrl(@id)}">
      <xsl:value-of select="@nodeName"/>
    </a>
  </li>
</xsl:for-each>
</ul>
    </xsl:if>

</xsl:template>

</xsl:stylesheet>

第二张宏

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:umbraco.library="urn:umbraco.library"
    exclude-result-prefixes="umbraco.library"
>

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

    <xsl:param name="currentPage" />

    <!-- Specify level of the top node for a language (usually 1) -->
    <xsl:variable name="level" select="1" />

    <!-- Grab the top node -->
    <xsl:variable name="siteRoot" select="$currentPage/ancestor-or-self::*[@level = $level]" />

    <xsl:template match="/">
        <ul class="menu">
            <!-- Create the Home link -->
            <li>
                <xsl:if test="$currentPage/@id = $siteRoot/@id">
                    <xsl:attribute name="class">sel</xsl:attribute>
                </xsl:if>
                <a href="{umbraco.library:NiceUrl($siteRoot/@id)}">
                    <xsl:value-of select="$siteRoot/@nodeName" />
                </a>
            </li>
            <!-- Process all children of $siteRoot (if any) -->
            <xsl:apply-templates select="$siteRoot/*[@isDoc][not(umbracoNaviHide = 1)]" />
        </ul>
    </xsl:template>

    <!-- Generic template for all nav links -->
    <xsl:template match="*[@isDoc]">
        <li>
            <xsl:if test="@id = $currentPage/@id">
                <xsl:attribute name="class">sel</xsl:attribute>
            </xsl:if>
            <a href="{umbraco.library:NiceUrl(@id)}">
                <xsl:value-of select="@nodeName" />
            </a>
            <!-- Render sub menu if necessary -->
            <xsl:call-template name="submenu" />
        </li>
    </xsl:template>

    <!-- Template for Inactive links -->
    <xsl:template match="*[@isDoc][umbracoNaviInactive = 1]">
        <li>
            <xsl:if test="@id = $currentPage/@id">
                <xsl:attribute name="class">sel</xsl:attribute>
            </xsl:if>
            <span>
                <xsl:value-of select="@nodeName" />
            </span>
            <!-- Submenu? -->
            <xsl:call-template name="submenu" />
        </li>
    </xsl:template>

    <!-- Template checking for, and processing any submenu -->
    <xsl:template name="submenu">
        <xsl:variable name="subPages" select="*[@isDoc][not(umbracoNaviHide = 1)]" />
        <xsl:if test="$subPages">
            <ul>
                <xsl:apply-templates select="$subPages" />
            </ul>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

好的 - 你有两个选择。快速破解或完整解决方案。

快速入侵是更新调用subnav的第二个宏,并在新闻页面中排除被调用的subnav(你也可以在这里包含其他页面)

在此示例中,我使用节点ID 1107作为新闻页面的ID,但您需要使用实际的新闻页面ID更新它。

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:umbraco.library="urn:umbraco.library"
    exclude-result-prefixes="umbraco.library"
>

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

    <xsl:param name="currentPage" />

    <!-- Specify level of the top node for a language (usually 1) -->
    <xsl:variable name="level" select="1" />

    <!-- Grab the top node -->
    <xsl:variable name="siteRoot" select="$currentPage/ancestor-or-self::*[@level = $level]" />

    <xsl:template match="/">
        <ul class="menu">
            <!-- Create the Home link -->
            <li>
                <xsl:if test="$currentPage/@id = $siteRoot/@id">
                    <xsl:attribute name="class">sel</xsl:attribute>
                </xsl:if>
                <a href="{umbraco.library:NiceUrl($siteRoot/@id)}">
                    <xsl:value-of select="$siteRoot/@nodeName" />
                </a>
            </li>
            <!-- Process all children of $siteRoot (if any) -->
            <xsl:apply-templates select="$siteRoot/*[@isDoc][not(umbracoNaviHide = 1)]" />
        </ul>
    </xsl:template>

    <!-- Generic template for all nav links -->
    <xsl:template match="*[@isDoc]">
        <li>
            <xsl:if test="@id = $currentPage/@id">
                <xsl:attribute name="class">sel</xsl:attribute>
            </xsl:if>
            <a href="{umbraco.library:NiceUrl(@id)}">
                <xsl:value-of select="@nodeName" />
            </a>
            <!-- Render sub menu if necessary excluding the news pages -->
            <xsl:if test="not(@id=1107)">
                <xsl:call-template name="submenu" />
            </xsl:if>
        </li>
    </xsl:template>

    <!-- Template for Inactive links -->
    <xsl:template match="*[@isDoc][umbracoNaviInactive = 1]">
        <li>
            <xsl:if test="@id = $currentPage/@id">
                <xsl:attribute name="class">sel</xsl:attribute>
            </xsl:if>
            <span>
                <xsl:value-of select="@nodeName" />
            </span>
            <!-- Submenu? -->
            <xsl:call-template name="submenu" />
        </li>
    </xsl:template>

    <!-- Template checking for, and processing any submenu -->
    <xsl:template name="submenu">
        <xsl:variable name="subPages" select="*[@isDoc][not(umbracoNaviHide = 1)]" />
        <xsl:if test="$subPages">
            <ul>
                <xsl:apply-templates select="$subPages" />
            </ul>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

这样做的正确方法是在文档类型中添加一个属性,以包含一个属性,表示不列出子项或类似项,然后在XSLT中测试它,但这是一个更复杂的修复,并且为此,我建议你阅读更多有关XSLT如何工作的内容。如果您想沿着这条路走下去,请告诉我,我有很多资源可以指导您

感谢,