2014-02-13 111 views
-1

我有以下XML输出:XSL转换XML到下拉HTML菜单

<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> 
+0

谢谢,我觉得我真的很接近,但我不能完全弄清楚如何让子菜单正确拉出。 – user3304420

回答

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>