我们有一个带有菜单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做到这一点?
答案 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>
完全符合您要求的格式。