我有以下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>
答案 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>