【问题标题】:How to generate XML for Menu using Dataset and display menu and menu items如何使用数据集为菜单生成 XML 并显示菜单和菜单项
【发布时间】:2014-01-27 11:41:25
【问题描述】:

我需要根据表/数据集中的值生成一个菜单。该表包含类似于下面的图像数据的数据。主菜单包含 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 将其绑定到菜单。

【问题讨论】:

  • 你为什么用xmlDataSource为什么不用其他数据源?
  • 实际上我被要求不要使用站点地图,因为每个用户的菜单都不同。上面显示的图像是普通用户。但是对于任何用户,菜单及其项都应该基于 ModuleID 显示。
  • 感谢您编辑@Mathias Muller..

标签: asp.net xml xslt menu


【解决方案1】:

xlst 文件存在一些问题:

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

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

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

这是对我有用的 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 很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多