1

ナビゲーションにXSLTを使用できるCMSを使用しています。デザインは、3つの異なるレベルで、それぞれに多少異なるマークアップを使用してナビゲーションを指示します。楽観的な開発者は、「汗を流さない」と述べ、「XSLTと一緒にハックするだけだ。つまり、どれほど難しいのだろうか」と語った。これが私の最初の間違いでした。

追いかけましょう:

XSLT

  <xsl:template match="/NavigationTree">    
    <xsl:if test="count(//Page) > 0">
      <ul class="floatLeft">

        <xsl:apply-templates select="Page">
          <xsl:with-param name="depth" select="1"/>
        </xsl:apply-templates>

      </ul>
    </xsl:if>
  </xsl:template>


  <xsl:template match="//Page">
    <xsl:param name="depth"/>
    <li>

      <xsl:if test="count(Page)">
        <ul>
          <xsl:apply-templates select="Subpage">
            <xsl:with-param name="depth" select="$depth+1"/>
          </xsl:apply-templates>
        </ul>
      </xsl:if>

    </li>
  </xsl:template>


  <xsl:template match="//Subpage">
    <xsl:param name="depth"/>
    <li class="test">
    </li>
  </xsl:template>

私の考えでは、最初のレベルでは「ページ」テンプレートを使用し、そのすべてのサブページでは「サブページ」テンプレートを使用する必要があります。代わりに、最初のレベルの2番目以降のすべてのアイテムは、「サブページ」テンプレートを使用します。そのテンプレートを削除すると、最初のレベル全体が正しく表示されますが、サブレベルは表示されません。私の知識のない推測では、ページテンプレート内のifステートメントに何か問題があります。

それは理にかなっていますか?

私は母国語よりもHTMLをよく知っていますが、XSLTに関しては新人です。何を探すべきかさえわからなかったので、この問題がどこかでカバーされているのなら、私を強力な賢者に導いてください。

4

1 に答える 1

1

私はそのように問題を解決しました:

    <xsl:template match="/NavigationTree">

    <xsl:if test="count(//Page) > 0">
        <xsl:apply-templates select="Page">
          <xsl:with-param name="depth" select="1"/>
        </xsl:apply-templates>
    </xsl:if>

  </xsl:template>  

  <xsl:template match="//Page">
    <xsl:param name="depth"/>
      <a>
        <xsl:attribute name="href"><xsl:value-of select="@FriendlyHref" disable-output-escaping="yes"/></xsl:attribute>
          <xsl:value-of select="@MenuText" disable-output-escaping="yes"/>
      </a>


      <xsl:if test="count(./Page)">

        <xsl:for-each select="./Page">

          <xsl:value-of select="@MenuText" disable-output-escaping="yes"/>

            <xsl:for-each select="./Page">
                <a href="{@FriendlyHref}">
                  <xsl:value-of select="@MenuText" disable-output-escaping="yes"/>
                </a>
            </xsl:for-each>

         </xsl:for-each>

        </xsl:if>

  </xsl:template>

XMLは十分に単純です。<Page />これは、ノードが互いにネストされているだけです。

<Page ID="99" MenuText="Branding days " Href="Default.aspx?ID=99" FriendlyHref="/en-GB/Corporate/Branding-days.aspx" ShowInSitemap="False" ShowInLegend="True" AbsoluteLevel="2" RelativeLevel="2" ChildCount="3" class="L2">

誰かがよりクリーンな解決策を持っているなら、私に知らせてください、しかし今のところそれは期待通りに機能します。

于 2012-05-21T11:18:23.883 に答える