如何使用数据集为菜单生成XML并显示菜单和菜单项

时间:2014-01-27 11:41:25

标签: asp.net xml xslt menu

我需要根据表/数据集中的值生成菜单。该表包含类似于下面的图像数据的数据。主菜单包含4个值,产品,应用程序,文档,支持。每个菜单都有其菜单项。

Menu and MenuItems

enter image description here

以下是母版页的网站站长代码:

<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将其绑定到菜单。

1 个答案:

答案 0 :(得分:1)

xlst文件存在一些问题:

  1. 在转换“菜单”时,未复制子项。

  2. 转换后的“菜单”属性“NavigateUrl”应该像其他属性一样 MenuItem,它是“URL”。

  3. 转换后的“菜单”属性错误,例如<xsl:value-of select="Text"/>应为<xsl:value-of select="@Text"/>

  4. 这是适用于我的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非常有帮助。