2012-02-27 112 views
2

我有一個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> 
    ... 

注:我問這個問題的動機是比什麼都重要的學術。

回答

0

否;你在那裏混合兩個平臺。如果你使用外部方法(使你自己的.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

3

你絕對可以做到這一點。

您需要在頁面生命週期的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

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> 

這種方式,你可以創建一個服務器控制...

+0

是剃刀語法或類型asp.net標記的,我不知道的? – 2012-02-27 06:51:56

+2

@Gabriel是短手的xslt語法;你應該經常在xslt中使用它(當映射屬性時) - 這是一個巨大的節省時間。它與asp.net或剃鬚刀無關,僅與xslt相關。這樣''類似於'' – 2012-02-27 07:00:12

+0

謝謝你,馬克= - 這真是太棒了。 – 2012-02-27 07:20:04

相關問題