XSL将XML转换为下拉html菜单

时间:2014-02-13 03:57:56

标签: php xml xslt

我有以下XML输出:

<payload>
<MenuItems>
<id>1</id>
<menuTitle>Members</menuTitle>
<description/>
<menuURL>members</menuURL>
<menuTarget/>
<parentID>0</parentID>
</MenuItems>
<MenuItems>
<id>2</id>
<menuTitle>Tiers</menuTitle>
<description/>
<menuURL>tiers</menuURL>
<menuTarget/>
<parentID>1</parentID>
</MenuItems>
</payload>

我需要将它(使用XSLT)转换为html菜单,如下所示:

<ul class="nav navbar-nav">
<li class="active"><a href="menuURL">menuTitle</a></li>
<li class="dropdown">
<a href="menuURL" class="dropdown-toggle" data-toggle="dropdown">menuTitle <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="menuURL">menuTitle</a></li>
</ul>
</li>
</ul>

换句话说,顶级菜单项(其中parentID = 0)应显示在主菜单中。

子菜单项(其中parentID =父菜单项的ID)应显示在该父菜单的下拉菜单中。

这似乎应该是一个使用XSL的简单转换,但由于某种原因我似乎无法让它工作。

非常感谢任何建议。

这是我一直在使用的当前XSL。我觉得它非常接近(主要菜单项正确拉动),但我不能完全拉动子菜单。

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


<xsl:template match="pkgInfo">
      <xsl:for-each select="payload">
      </xsl:for-each>
</xsl:template>


<xsl:template match="payload">
    <ul class="nav navbar-nav">
        <xsl:apply-templates select="MenuItems[parentID=0]"/>
    </ul>
</xsl:template>


<xsl:template match="MenuItems">
            <li><a href="{menuURL}"><xsl:value-of select="menuTitle"/></a></li>
            <xsl:param name="currentParent" select="id" />
            <xsl:apply-templates select="MenuItems[parentID=$currentParent]"/>
</xsl:template>

<xsl:template match="MenuItems">
    <li class="dropdown">
        <a href="{menuURL}" class="dropdown-toggle" data-toggle="dropdown">   
<xsl:value-of select="menuTitle"/> <b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li><a href="menuURL"><xsl:value-of select="menuTitle"/></a></li>
        </ul>
    </li>
</xsl:template>


</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:0)

我认为你需要这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output omit-xml-declaration="yes"/>

<xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="payload">
        <ul class="nav navbar-nav">
            <xsl:apply-templates/>
        </ul>
    </xsl:template>

    <xsl:template match="MenuItems">
        <xsl:variable name="currentParent" select="id" />
        <xsl:if test="parentID='0'">
            <li class="active"><a href="{menuURL}"><xsl:value-of select="menuTitle"/></a></li>
            <li class="dropdown">
                <a href="{menuURL}" class="dropdown-toggle" data-toggle="dropdown"><xsl:value-of select="menuTitle"/> <b class="caret"></b></a>
                <ul class="dropdown-menu">
                    <xsl:apply-templates select="following-sibling::MenuItems[parentID=$currentParent]" mode="nest"/>
                </ul>
            </li>
        </xsl:if>
    </xsl:template>

    <xsl:template match="MenuItems[parentID != '0']" mode="nest">
        <li><a href="{menuURL}"><xsl:value-of select="menuTitle"/></a></li>
    </xsl:template>

</xsl:stylesheet>

当应用于您的输入XML时,它会生成:

<ul class="nav navbar-nav">
    <li class="active">
        <a href="members">Members</a>
    </li>
    <li class="dropdown">
        <a href="members" class="dropdown-toggle" data-toggle="dropdown">Members<b class="caret"
            ></b></a>
        <ul class="dropdown-menu">
            <li>
                <a href="tiers">Tiers</a>
            </li>
        </ul>
    </li>
</ul>