-1

我们有一个当前系统,其中包含以下格式的菜单 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 做到这一点?

4

1 回答 1

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>

它完全符合您要求的格式。

于 2013-03-31T20:38:21.067 回答