有没有办法让一个asp.net页面来自XSLT转换?

问题描述:

我有一个XSLT转换输出表的键/值对:有没有办法让一个asp.net页面来自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> 
    ... 

注:我问这个问题的动机是比什么都重要的学术。

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

+1

不建议OP本身做到这一点,但为什么他/她不能在预先生成的控件?他/她只是生成要在页面加载事件中处理的“标记”。 – Jordan 2012-02-27 06:37:52

+0

@Jordan,因为xslt不是用于创建asp.net控件的**;它是变换工具。就像我之前提到的那样,你可以*为xslt处理器提供一个外部对象来执行它,但是:xslt是这里的关键。 – 2012-02-27 06:46:36

+1

xslt它旨在将XML转换为其他形式.... asp.net控件很好地适用于此。就它的转化能力而言,它似乎属于它的范畴。对于任何特定类型的转换,我不会说xslt是_intended_。 – Jordan 2012-02-27 06:54:36

你绝对可以做到这一点。

您需要在页面生命周期的PreInit PreInit阶段执行此操作。我认为如果你不使用视图状态,你可以在PreLoad中完成,但我不是100%的。
只要它是一个好主意,它取决于你为什么要这样做。

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

此外,这是一个网站,我已经看到了一段时间,与你的例子。 XSLT To generate .NET tags

+0

你是说PreInit在ASPX标记被解析之前,我可以在那里改变它? – 2012-02-27 06:42:17

+0

是的,如果你读的第一个链接,你可以看到控件,并且这些都不会加载,直到加载。不过,我建议你按照第二个链接。它使用加载事件来创建所需的控件。我会建议1改变,我将在一个单独的评论。 – Jordan 2012-02-27 06:44:32

+0

如果按照第二连杆,它是有点老了,我会改变的XslTransform到XslCompiledTransform。此外,如果您使用的是一遍又一遍相同的XSL片,我建议您缓存结果XslCompiledTransform它会节省很多开销在应用程序:) – Jordan 2012-02-27 06:44:51

是的,您可以用自己的方式定义您的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> 

这种方式,你可以创建一个服务器控制...

+0

是剃刀语法或类型asp.net标记的,我不知道的? – 2012-02-27 06:51:56

+2

@Gabriel是短手的xslt语法;你应该经常在xslt中使用它(当映射属性时) - 这是一个巨大的节省时间。它与asp.net或剃须刀无关,仅与xslt相关。这样''类似于' XSL:属性>' – 2012-02-27 07:00:12

+0

谢谢你,马克= - 这真是太棒了。 – 2012-02-27 07:20:04