有没有办法让一个asp.net页面来自“即时”的XSLT转换?

时间:2012-02-27 06:27:09

标签: c# asp.net xslt

我有一个XSLT转换来输出一个键/值对表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="keys">
    <table border="1">
      <xsl:apply-templates select="key" />
    </table>
  </xsl:template>
  <xsl:template match="key">
    <tr>
      <td>
        <xsl:value-of select="@name" />
      </td>
      <td>
        <pre>
          <xsl:value-of select="." />
        </pre>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

我目前正在使用<asp:Xml />服务器控件。

asp.net页面循环的动态特性让我觉得有可能生成实际的服务器端标签并获得一种即时代码生成功能。这是可能的/好主意吗?

因此XSLT将包含:

  ...
        <asp:Label runat="server"><xsl:value-of select="@name" /></asp:Label>
  ...

注意:我的询问动机比其他任何事情更具学术性。

3 个答案:

答案 0 :(得分:3)

你绝对可以这样做。

您需要在页面生命周期的PreInit PreInit阶段执行此操作。我想如果你没有使用viewstate,你可以在PreLoad中做到这一点,但我不是100%就可以了。
只要它是一个好主意,它取决于你为什么要这样做。

如果你这样做只是为了做到这可能是一个坏主意:)你只是让你的应用程序过于复杂。如果它满足您需要的一些功能需求,那么这是一个好主意和优雅的解决方案。 :)

补充:这是我之前看过的一个网站,上面有一个例子给你。 XSLT To generate .NET tags

答案 1 :(得分:2)

是的,您可以用自己的方式定义XML,然后使用XSLT将这些标记转换为服务器端控件。这是一个基本的例子......

<section type="Panel" id="dyna_panel_Riskfactors" GroupingText="Identified Risk factors:" Width="200px">
   <control type="CheckBoxList" id="dyna_chkl_Riskfactors" CssClass="" ToolTip="Identified Risk factors">
     <subcontrol Type="ListItem" Text="Tattooing" Value="Tattooing" Selected="False" />
     <subcontrol Type="ListItem" Text="IV drug user" Value="IV drug user" Selected="False" />
     <subcontrol Type="ListItem" Text="Dont Know" Value="Dont Know" Selected="False" />
   </control>
</section>

然后使用以下代码将XML转换为网页或网页的一部分......

  <!--For CheckBoxList-->
  <xsl:if test="@type='CheckBoxList'">
    <asp:CheckBoxList id="{@id}" CssClass="{@CssClass}" runat="server" ToolTip="{@ToolTip}" Width="{@Width}">
      <xsl:for-each select="subcontrol">
        <asp:ListItem Value="{@Value}" Selected="{@Selected}">
          <xsl:value-of select="@Text" />
        </asp:ListItem>
      </xsl:for-each>
    </asp:CheckBoxList>
  </xsl:if>

这样您就可以创建服务器控件...

答案 2 :(得分:0)

没有;你在那里混合两个平台。如果您使用外部方法(在xslt中使用自己的.NET方法)进行很多工作,那么您可能会使它工作,但我认为这将非常难看。如果您使用的是xslt,您可能会认为它更像MVC - 您正在生成原始输出(html),而不是服务器端对象。