【发布时间】: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