使用XSLT转换XML在asp:menu中使用

时间:2013-03-31 20:08:12

标签: xml xslt

我们有一个带有菜单XML文件的当前系统,其格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<Menu>
<item name="A" value="Red Apple" />
<item name="B" value="Black Board" />
<item name="B" value="Blue Earth" />
</Menu>

ASP:菜单

<asp:Menu ID="MenuControl" runat="server" Orientation="Horizontal" >
<DataBindings>
<asp:MenuItemBinding TextField="MenuText" ToolTipField="tooltip" NavigateUrlField="destUrl" />
</DataBindings>
</asp:Menu>

为了将此数据绑定到asp:menu,结果应采用以下格式:

<?xml version="1.0" encoding="UTF-8"?>
<MenuItems>
   <MenuItem MenuText="A" tooltip="A" destUrl="">
      <MenuItem MenuText="Red Apple" tooltip="Red Apple" destUrl="~/RedApple.aspx" />
   </MenuItem>
   <MenuItem MenuText="B" tooltip="B" destUrl="">
      <MenuItem MenuText="Black Board" tooltip="Black Board" destUrl="~/BlackBoard.aspx" />
      <MenuItem MenuText="Blue Earth" tooltip="Blue Earth" destUrl="~/BlueEarth.aspx" />
   </MenuItem>
</MenuItems>

XSLT似乎是合乎逻辑的选择。有谁知道如何使用XSLT做到这一点?

1 个答案:

答案 0 :(得分:0)

这是执行请求转换的XSLT。由于在Xml源文件中没有提供destUrl,因此它是通过将空格替换为空来从@value生成的。

<?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"/>
  <xsl:key name="name" match="item" use="@name" />

  <xsl:template match="Menu">
    <MenuItems>
      <xsl:apply-templates select="item[generate-id(.)=generate-id(key('name',@name)[1])]"/>
    </MenuItems>
  </xsl:template>

  <xsl:template match="item">
    <MenuItem MenuText="{@name}" tooltip="{@name}" destUrl="">
      <xsl:for-each select="key('name', @name)">
        <MenuItem MenuText="{@value}" tooltip="{@value}" destUrl="~/{translate(@value, ' ','')}.aspx" />
      </xsl:for-each>
    </MenuItem>
  </xsl:template>
</xsl:stylesheet>

完全符合您要求的格式。