【问题标题】:Multiple templates in XSLT based on page levelXSLT 中基于页面级别的多个模板
【发布时间】:2012-05-21 19:18:23
【问题描述】:

我正在使用 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'mighty wisemen.

【问题讨论】:

  • 如果没有看到源 xml 的示例就很难判断。
  • 源代码由 CMS 神奇地提供。我会看看我是否能弄清楚如何以某种方式提取它。
  • Page 元素中是否真的有 Subpage 元素,或者它们也被称为 Page?第二个模板看起来很奇怪,因为它计算 Page 子元素,但尝试为 Subpage 子元素应用模板。
  • @Martin 啊,不一定。我做了那个。我的逻辑是“如果这是当前级别的子页面,请应用“子页面”模板”。正如我所说,当谈到 XSLT 时,我完全是个新手。也许这需要我做更多的研究......
  • @Nix:您只需应用身份转换即可获得源 XML 的副本:dpawson.co.uk/xsl/sect2/identity.html

标签: xslt


【解决方案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 很简单。只是&lt;Page /&gt; 节点相互嵌套。

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

如果有人有更清洁的解决方案,请告诉我,但目前它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多