“动态”XSLT提供webbrowser控件?

时间:2009-01-25 09:54:08

标签: c# xml xslt webbrowser-control

我经常在应用程序中使用HTML输出,到目前为止我已经使用了一些简单的例程来构建HTML字符串。我现在想尝试一些不同的东西:

我想将数据序列化为XML,并提供一些XSLT模板来生成webbrowser控件的HTML。我让它静态工作(通过编写XSL慢慢挖掘),但我需要动态更改XSL文档的一些属性:过滤器,路径等,以跟随当前的UI选择。

数据足够小,以至于更改时的XML序列化不应成为问题。我想使用“静态”外部XSL文件(以便用户可以在一定程度上自定义输出),但需要调整。

我的问题:

这个想法在技术上是否合理? 我可以使用XML和XSL文档动态提供Web浏览器控件吗? 我可以动态修改XSL中的选定路径元素和属性(即不生成新文件)吗? 如何在Web浏览器控件中执行此操作? (一些指导我开始会很好..)

[编辑]感谢大家,它正在运作:D [/ edit]

3 个答案:

答案 0 :(得分: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();
}

如果用户正在更新的UI位于WebBrowser本身(即HTML页面包含HTML UI控件),那么您应该使用动态HTML技术,就像在页面中显示页面时一样。普通浏览器。那是一包完全不同的香蕉。

答案 1 :(得分:3)

XslCompiledTransform支持parameters,还支持extension objects(两者都来自XsltArgumentList.对于任何简单的事情,请尝试使用参数;扩展对象允许更丰富的功能(由您决定)想象力),但不像其他xslt供应商那样可移植。第三个选项是选项的外部文件,加载到xsl:document的变量中。

当然,如果你感到勇敢,你可以使用xslt动态编写一个xslt - 虽然不是一件容易的事。

在大多数非平凡的情况下,最简单的方法是使用WebBrowser针对平面文件(在%tmp%区域内,或针对本地Web服务器(例如HttpListener);更改html直接倾向于使控件稍微混淆有效的安全上下文。

答案 2 :(得分:1)

我不知道您的应用程序是什么样的,所以我不想说这是好主意还是坏主意。

关于您的其他问题:

您可以将内存中的数据和load it转换为Web浏览器控件。否则,您需要将数据保存到临时文件中。

你可以make choices at runtime with XSLT parameters