1

我正在使用 CMS,它允许使用 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>

我的想法是,第一级应该使用“页面”模板,所有子页面都应该使用“子页面”模板。相反,第一级中第二个之后的所有项目都使用“子页面”模板。如果我删除该模板,它会正确显示整个第一层——但没有子层。我没有受过教育的猜测是页面模板中的 if 语句有问题。

那有意义吗?

我比我的母语口语更了解 HTML,但在 XSLT 方面我还是个新手。我什至不知道要搜索什么,所以如果这个问题已经在其他地方得到解决,请指导我 O' 强大的智者。

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 回答