6

我正在为 DotNetNuke 开发一个 DDR Treeview 菜单,以仅显示选定的根项目及其要展开的子节点。这是我想要实现的目标。(左侧垂直菜单)有什么建议吗?

在此处输入图像描述

这是 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>
4

3 回答 3

1

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

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

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

您可以跳过第一个模板匹配和那些第一个 if 元素并直接匹配您感兴趣的内容。无需测试,这样的事情应该可以解决问题:

<!-- ... -->
<!-- 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>
于 2013-04-26T09:26:23.230 回答
1

如果没有源 XML,很难弄清楚您在这里尝试做什么,但我想说您获得所有节点的主要原因是与node元素匹配的模板是递归的并且不会隐藏后代。如果您在模板末尾的元素上添加display:none属性(或更改为style),您可能会得到您想要的。ulnodelist-item-styledisplay

于 2013-06-24T02:56:56.330 回答
0

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

于 2014-02-13T13:46:29.153 回答