-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 は次のとおりです。destUrl は Xml ソース ファイルで提供されていないため、スペースを何も置き換えずに @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 に答える