2

我有一个像这样的 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>
4

1 回答 1

1

您可以这样做的面包屑,通过选择活动节点然后遍历祖先,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" indent="yes"/>

    <xsl:template match="/">
        <!--Obviously set your PHP variable here-->
        <xsl:variable name="id">bananas</xsl:variable>
        <!--Find this node somewhere in the tree-->
        <xsl:apply-templates select=".//node[@id=$id]"/>
    </xsl:template>

    <xsl:template match="node">
        <!--Walk the ancestors-->
        <xsl:for-each select="ancestor-or-self::node">
        <!--Snappy path separator here-->
            <xsl:text> --> </xsl:text>
            <a>
                <xsl:attribute name="href">
                    <xsl:value-of select="@url" />
                </xsl:attribute>
                <xsl:value-of select="label/text()"/>
            </a>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>    

示例菜单 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>
    <node id="products" url="urlN1.php">
        <label>Products</label>
        <node id="food" url="urlN2.php">
            <label>Food</label>
            <node id="fruit" url="urlN3.php">
                <label>Fruit</label>
                <node id="bananas" url="urlN4.php">
                    <label>Bananas</label>
                </node>
            </node>
            <node id="clothes" url="urlN3.php">
                <label>Clothes</label>
                <node id="shirts" url="urlN4.php">
                    <label>Shirts</label>
                </node>
            </node>
        </node>
    </node>
</menu>

编辑更新 - 您已更新 Q 以将面包屑显示为列表 - 这是一个更新的模板以防万一:)

<xsl:template match="node">
    <ul>
        <!--Walk the ancestors-->
        <xsl:for-each select="ancestor-or-self::node">
            <li>
                <a>
                    <xsl:attribute name="href">
                        <xsl:value-of select="@url" />
                    </xsl:attribute>
                    <xsl:value-of select="label/text()"/>
                </a>
            </li>
        </xsl:for-each>
    </ul>
</xsl:template>
于 2012-09-14T08:31:09.053 回答