DDR Treeview菜单显示选定的根及其子节点

时间:2013-02-19 13:43:48

标签: asp.net xml xslt treeview dotnetnuke

我在DotNetNuke的DDR Treeview菜单上工作,只显示选定的Root项及其要扩展的子节点。这就是我想要实现的目标。 (左垂直菜单) 有什么建议吗?

enter image description here

这是xslt代码,目前显示所有根项。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:param name="ControlID" />
  <xsl:param name="Options" />
  <xsl:template match="/*">
    <xsl:apply-templates select="root" />
  </xsl:template>
  <xsl:template match="root">
    <xsl:if test="node">
      <ul class="treeview filetree" id="{$ControlID}">
        <xsl:apply-templates select="node" />
      </ul>
      <script type="text/javascript">
        jQuery(function($) {
          $("#<xsl:value-of select="$ControlID" />").treeview(
            <xsl:value-of select="$Options" disable-output-escaping="yes" />
          );
        });
      </script>
    </xsl:if>
  </xsl:template>
  <xsl:template match="node">
    <li>
      <xsl:if test="node and (@depth != 0 or @breadcrumb = 1)">
        <xsl:attribute name="class">open</xsl:attribute>
      </xsl:if>
      <xsl:choose>
        <xsl:when test="@enabled = 0">
          <xsl:value-of select="@text" />
        </xsl:when>
        <xsl:otherwise>
          <a href="{@url}">
            <xsl:choose>
              <xsl:when test="@selected=1">
                <xsl:attribute name="class">selected breadcrumb</xsl:attribute>
              </xsl:when>
              <xsl:when test="@breadcrumb=1">
                <xsl:attribute name="class">breadcrumb</xsl:attribute>
              </xsl:when>
            </xsl:choose>
            <xsl:value-of select="@text" />
          </a>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:if test="node">
        <ul style="list-item-style:none">
          <xsl:apply-templates select="node" />
        </ul>
      </xsl:if>
    </li>
  </xsl:template>
</xsl:stylesheet>

3 个答案:

答案 0 :(得分:1)

如果您提供了要转换的输入代码示例,那将会有所帮助。

我认为它基本上是这样的:

<root>
  <node enabled="1" depth="1" text="Service" selected="true" breadcrumb="0"/>
  <node>
    <node>
      <node/>
    </node>
  </node>
  <node>
    <node/>
  </node>
  <node/>
</root>

你可以跳过第一个模板匹配和第一个if-element,直接匹配你感兴趣的东西。没有测试,这样的东西应该可以解决问题:

<!-- ... -->
<!-- process only "root" elements that have at least one "node" element -->
<xsl:template match="/root[node]">
  <ul class="treeview filetree" id="{$ControlID}">
    <xsl:apply-templates select="node" />
  </ul>
  <!-- ... -->
</xsl:template>
<xsl:template match="node">
  <!-- ... -->
</xsl:template>

答案 1 :(得分:1)

如果没有源XML,很难找出你在这里尝试做的事情,但是我说你得到所有节点的主要原因是匹配的模板node元素是递归的,不会隐藏后代。如果您将display:none添加到style模板末尾ul元素的node属性中(或将list-item-style更改为display) ,你可能得到你想要的东西。

答案 2 :(得分:0)

如果您只获取根项目,则需要更改为菜单定义的NodeSelector。我相信速记值RootChildren会给你你想要的东西。