我需要根据表/数据集中的值生成菜单。该表包含类似于下面的图像数据的数据。主菜单包含4个值,产品,应用程序,文档,支持。每个菜单都有其菜单项。
以下是母版页的网站站长代码:
<asp:Menu ID="Menu1" runat="server" DataSourceID="XmlDataSource1" BackColor="#0072c5"
CssClass="Menu" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="12px"
ForeColor="#F7F6F3" Width="100%" StaticSubMenuIndent="10px" Orientation="Horizontal"
StaticDisplayLevels="2">
<DataBindings>
<asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl" TextField="Text" ToolTipField="ToolTip" />
</DataBindings>
</asp:Menu>
<asp:XmlDataSource ID="XmlDataSource1" TransformFile="~/Default2.xslt" XPath="MenuItems/MenuItem"runat="server"></asp:XmlDataSource>
我生成了如下的XML。
<Menus ProductName="Acapella Admin">
<Menu MenuID="1" Text="Products">
<MenuItem MenuID="1" Text="ProductInfo" URL="ProductInfo.aspx"/>
<MenuItem MenuID="2" Text="Product Features" URL="ProductFeatures.aspx"/>
<MenuItem MenuID="3" Text="Products Details" URL="ProductDetails.aspx" />
</Menu>
<Menu MenuID="1" Text="Applications">
<MenuItem MenuID="1" Text="MobileApps" URL="MobileApps.aspx"/>
<MenuItem MenuID="2" Text="Web Applications" URL="WebApplications.aspx"/>
<MenuItem MenuID="3" Text="Portal" URL="Portal.aspx" />
</Menu>
<Menu MenuID="2" Text="Document">
<MenuItem MenuID="4" Text="Tutorial" URL="Tutorial.aspx" />
</Menu>
<Menu MenuID="4" Text="Support">
<MenuItem MenuID="5" Text="FAQs" URL="FAQs.aspx" />
<MenuItem MenuID="6" Text="Contact us" URL="ContactUS.aspx" />
</Menu>
</Menus>
我的XSLT样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<!-- Replace root node name Menus with MenuItems
and call MenuListing for its children-->
<xsl:template match="/Menus">
<MenuItems>
<xsl:call-template name="MenuListing" />
</MenuItems>
</xsl:template>
<!-- Allow for recursive child nodeprocessing -->
<xsl:template name="MenuListing">
<xsl:apply-templates select="Menu" />
</xsl:template>
<xsl:template match="Menu">
<MenuItem>
<!-- Convert Menu child elements to MenuItem attributes -->
<xsl:attribute name="Text">
<xsl:value-of select="Text"/>
</xsl:attribute>
<xsl:attribute name="ToolTip">
<xsl:value-of select="Description"/>
</xsl:attribute>
<xsl:attribute name="NavigateUrl">
<xsl:text>?Sel=</xsl:text>
<xsl:value-of select="Text"/>
</xsl:attribute>
<!-- Recursively call MenuListing forchild menu nodes -->
<xsl:if test="count(Menu) >0">
<xsl:call-template name="MenuListing" />
</xsl:if>
</MenuItem>
</xsl:template>
</xsl:stylesheet>
帮助我生成XML并使用XmlDataSource将其绑定到菜单。
答案 0 :(得分:1)
xlst文件存在一些问题:
在转换“菜单”时,未复制子项。
转换后的“菜单”属性“NavigateUrl”应该像其他属性一样 MenuItem,它是“URL”。
转换后的“菜单”属性错误,例如<xsl:value-of
select="Text"/>
应为<xsl:value-of select="@Text"/>
。
这是适用于我的xlst文件:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Replace root node name Menus with MenuItems
and call MenuListing for its children-->
<xsl:template match="Menus">
<MenuItems>
<xsl:call-template name="MenuListing" />
</MenuItems>
</xsl:template>
<!-- Allow for recursive child nodeprocessing -->
<xsl:template name="MenuListing">
<xsl:apply-templates select="Menu" />
</xsl:template>
<xsl:template match="Menu">
<MenuItem>
<!-- Convert Menu child elements to MenuItem attributes -->
<xsl:attribute name="Text">
<xsl:value-of select="@Text"/>
</xsl:attribute>
<xsl:attribute name="ToolTip">
<xsl:value-of select="@Description"/>
</xsl:attribute>
<xsl:attribute name="URL">
<xsl:text>?Sel=</xsl:text>
<xsl:value-of select="@Text"/>
</xsl:attribute>
<xsl:apply-templates />
<!-- Recursively call MenuListing forchild menu nodes -->
<xsl:if test="count(Menu) >0">
<xsl:call-template name="MenuListing" />
</xsl:if>
</MenuItem>
</xsl:template>
</xsl:stylesheet>
这是我用过的标记:
<asp:Menu ID="Menu1" runat="server" DataSourceID="XmlDataSource1" BackColor="#0072c5"
CssClass="Menu" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="12px"
ForeColor="#F7F6F3" Width="100%" StaticSubMenuIndent="10px" Orientation="Horizontal"
StaticDisplayLevels="1">
<DataBindings>
<asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="URL" TextField="Text"/>
</DataBindings>
</asp:Menu>
<asp:XmlDataSource ID="XmlDataSource1" DataFile="~/Default1.xml" TransformFile="~/Default2.xslt" XPath="MenuItems/MenuItem" runat="server"></asp:XmlDataSource>
我建议使用在线xslt转换器来检查转换后的xml。我发现this one非常有帮助。