2009-01-25 73 views
2

我經常在應用程序中使用HTML輸出,直到現在我已經使用一些簡單的例程來構建HTML字符串。我想嘗試一些不同的東西:「動態」的XSLT餵給webbrowser控件?

我想將數據序列化爲XML,並提供一些XSLT模板來爲webbrowser控件生成HTML。我得到這個工作靜態(慢慢挖掘通過編寫XSL),但我需要改變XSL文件的一些屬性:過濾器,路徑等,以跟隨當前的用戶界面選擇。

數據足夠小,XML更新序列化不應該成爲問題。我想使用「靜態」外部XSL文件(以便用戶可以在一定程度上自定義輸出),但要進行調整。

我的問題:

這個想法在技術上是否合理?
我可以使用XML和XSL文檔動態地提供Web瀏覽器控件嗎? 我是否可以即時修改XSL中的選定路徑元素和屬性(即不生成新文件)? 如何在網頁瀏覽器控件中做到這一點? (一些指針,讓我開始將是很好的。)

[編輯]謝謝你的鄉親,它的工作:d [/編輯]

回答

7

通常情況下,要在運行時爲變換提供參數,並編寫變換以使其行爲由參數控制。

通常當我這樣做時,我只傳入一個參數 - 一個XML文檔 - 並讓模板查詢它以確定它們應該做什麼。所以你會看到類似的東西:

<xsl:template match="*"> 
    <xsl:variable name="cfg" select="$config/*[name() = current()]"/> 
    <xsl:choose> 
     <xsl:when test="cfg/elementType = 'option'"> 
     <xsl:apply-templates select="." mode="option"> 
     <xsl:when test="cfg/elementType = 'optgroup'"> 
     <xsl:apply-templates select="." mode="optgroup"> 
     <xsl:when test="cfg/elementType = 'a'"> 
     <xsl:apply-templates select="." mode="a"> 

等等。

這是非常簡單的使用XML/XSLT動態地養活一個WebBrowser控件:

using (XmlWriter xw = XmlWriter.Create(new StringWriter(output))) 
{ 
    StringBuilder output = new StringBuilder(); 
    XsltArgumentList args = new XsltArgumentList(); 
    args.AddParam("config", myConfigXml); 
    myXslt.Transform(myXml, args, xw); 
    xw.Flush(); 
    myWebBrowser.DocumentText = output.ToString(); 
} 

如果用戶是更新用戶界面是在web瀏覽器本身(即HTML頁面中包含HTML UI控件) ,您應該使用動態HTML技術,就像使用普通瀏覽器顯示頁面一樣。這是一個完全不同的香蕉袋。

1

我不知道你的應用程序的樣子,所以我不會」不要說這是一個好的還是壞的想法。

關於你提到的其他問題:

您可以在內存中轉換數據和load it到Web瀏覽器的控制。否則,您需要將數據保存到臨時文件。

可以make choices at runtime with XSLT parameters

3

XslCompiledTransform支持parameters,也extension objects(都是通過XsltArgumentList.對於任何簡單的,儘量使用參數;擴展對象允許更豐富的功能(最多你的想象),但不便攜到其他xslt供應商,第三個選項是一個外部文件的選項,加載到一個變量xsl:document

當然,如果你感覺很勇敢,你可以使用xslt來動態地寫一個xslt - 不是微不足道的。

在大多數非平凡情況下,對平面文件(位於%tmp%區域或本地網絡服務器(例如HttpListener))使用WebBrowser最爲簡單。直接更改html往往會使控件稍微混淆有效的安全上下文。