我有一个像这样的 XML:
<menu>
<node id="home" url="url1.php">
<label>Homepage</label>
<node id="user" url="url2.php"><label>User profile</label></node>
<node id="help" url="url3.php"><label>Help page</label></node>
...
</node>
</menu>
它用于生成菜单,XML 具有node
嵌套在第一个“home”下的任何级别的标签node
。我传递了一个$id
用 PHP 调用的参数,它给出了当前活动的菜单项。
(这<label>
是在一个单独的标签中,而不是作为属性,因为我有很多本地化标签,实际的 xml 就像<label lang='en'>...</label><label lang='it'>...</label>
)
这个想法是使用各种 XSL 来生成主菜单、面包屑、部分标题(顶部菜单)。对于主菜单,我设法做到了:
<xsl:template match="menu">
<xsl:apply-templates select="node" />
</xsl:template>
<xsl:template match="//node">
<ul>
<li>
<a>
<xsl:if test="@id=$id">
<xsl:attribute name='class'>active</xsl:attribute>
</xsl:if>
<xsl:attribute name='href'>
<xsl:value-of select="@url" />
</xsl:attribute>
<xsl:value-of select="label"/>
</a>
<xsl:if test="count(child::*)>0">
<xsl:apply-templates select="node" />
</xsl:if>
</li>
</ul>
</xsl:template>
</xsl:stylesheet>
它有效。但我被面包屑困住了。如何仅将特定节点与@id=$id
他的祖先隔离,以从主页构建到当前页面的面包屑?
对于节点广告,生成的 html 应该是第三个嵌套级别:
<ul>
<li><a href="url1.php">Home</a></li>
<li><a href="urla.php">Some child of home</a></li>
<li><a href="urlb.php">Some grandchild of home</a></li>
<li><a class='active' href="urlc.php">Current page which is child of the above</a></li>
</url>