2014-02-13 135 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>