2014-01-27 21 views
1

我需要根據表/數據集中的值生成菜單。該表包含與以下圖像數據類似的數據。主菜單包含4個值,產品,應用程序,文檔,支持。每個菜單都有其菜單項。如何使用數據集和顯示菜單和菜單項來生成菜單的XML

Menu and MenuItems

enter image description here

下面是用於主網頁的代碼SITEMASTER:

<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

你爲什麼使用'xmlDataSource'爲什麼不能使用其他數據源呢? –

+0

其實我被要求不要使用siteMaps,因爲每個用戶的Menu不同。上面顯示的圖片屬於普通用戶。但是對於任何用戶菜單及其項目應該基於ModuleID顯示。 – Sanjeev4evr

+0

感謝您編輯@Mathias Muller .. – Sanjeev4evr

回答

1

有一些問題與XLST文件:

  1. 同時改造 「菜單」 S,孩子們不會被複制。

  2. 轉換後的「Menu」屬性「NavigateUrl」應該與其他 MenuItem一樣,它是「URL」。

  3. 轉換的「菜單」屬性是錯誤的,例如, <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非常有幫助。