2012-05-11 14 views
1

私はナビゲーション用にXSLTを使用できるようにCMSを使用しています。このデザインでは、3つの異なるレベルと、それぞれに異なるマークアップを使用したナビゲーションが規定されています。楽観的な開発者は、「汗がかからない」と、「XSLTと一緒にハックするだけだ。これが私の最初の間違いでした。ページレベルに基づく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> 

私の考えは最初のレベルは、「ページ」テンプレートを使用する必要があること、であり、すべてのそれのサブページは、「サブページ」を使用する必要がありますテンプレート。代わりに、第1レベルの2番目以降のすべての項目は、 "サブページ"テンプレートを使用します。そのテンプレートを削除すると、第1レベル全体が正しく表示されますが、サブレベルは表示されません。私の教育されていない推測は、ページテンプレート内のifステートメントで何かが間違っているということです。

それは意味がありますか?

私の母国語よりもHTMLがよく分かりますが、XSLTに関しては新人です。私は何を探すべきか把握することもできなかったので、もしこの問題がどこか他のところでカバーされていたなら、O '力のある賢明な人たちを案内します。

+0

ソースxmlの例が表示されていないとわかりにくいです。 – Filburt

+0

ソースはCMSによって魔法のように配信されます。私は何とかそれを抽出する方法を見つけることができるかどうかを確認します。 – Nix

+0

_Subpage_要素が_Page_要素の中に本当に存在するのですか、それとも_Page_とも呼ばれていますか? 2番目のテンプレートは、_Page_子要素を数えますが、_Subpage_子のテンプレートを適用しようとすると奇妙に見えます。 – Martin

答えて

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"> 

清潔なソリューションをお持ちの方は、教えてください。今のところは期待どおりです。