6

選択したルートアイテムと展開する子ノードのみを表示するために、DotNetNukeのDDRツリービューメニューに取り組んでいます。これが私が達成しようとしていることです。(左縦メニュー)何かアドバイスはありますか?

ここに画像の説明を入力してください

これは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>

最初のtemplate-matchと最初の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>
于 2013-04-26T09:26:23.230 に答える
1

ソースXMLがないと、ここで何をしようとしているのかを理解するのは非常に困難ですが、すべてのノードを取得する主な理由は、要素に一致するテンプレートnodeが再帰的であり、子孫を非表示にしないためです。テンプレートの最後にある要素の属性に追加display:noneする(またはに変更する)と、必要なものが得られる場合があります。styleulnodelist-item-styledisplay

于 2013-06-24T02:56:56.330 に答える
0

ルートアイテムのみを取得している場合はNodeSelector、メニューの定義を変更する必要があります。RootChildren速記の値はあなたが望むものを与えると私は信じています。

于 2014-02-13T13:46:29.153 に答える