【问题标题】:"dynamic" XSLT to feed webbrowser control?“动态” XSLT 提供网络浏览器控件?
【发布时间】:2010-10-03 09:49:42
【问题描述】:

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

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

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

我的问题:

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

[edit]谢谢大家,它正在工作:D[/edit]

【问题讨论】:

    标签: c# xml xslt webbrowser-control


    【解决方案1】:

    通常的方法是在运行时为转换提供参数并编写转换,以便其行为由参数控制。

    通常,当我这样做时,我只传递一个参数——一个 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 技术,就像页面显示在普通浏览器。那是一袋完全不同的香蕉。

    【讨论】:

      【解决方案2】:

      XslCompiledTransform 支持parameters,也支持extension objects(两者都通过XsltArgumentList. 对于任何简单的事情,请尝试使用参数;扩展对象允许更丰富的功能(取决于您的想象),但不那么便携到其他 xslt 供应商。第三个选项是选项的外部文件,加载到带有 xsl:document 的变量中。

      当然,如果你有勇气的话,你可以使用 xslt 动态地编写一个 xslt——不过这并不简单。

      在大多数重要的情况下,最简单的方法是使用 WebBrowser 处理平面文件(在 %tmp% 区域,或本地 Web 服务器(例如 HttpListener);直接更改 html 往往让控件稍微混淆一下有效的安全上下文。

      【讨论】:

        【解决方案3】:

        我不知道你的应用程序是什么样子,所以我不会说这是一个好主意还是坏主意。

        关于您的其他问题:

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

        你可以make choices at runtime with XSLT parameters

        【讨论】:

          猜你喜欢
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 2010-12-02
          • 2012-03-26
          • 2012-10-30
          • 1970-01-01
          相关资源
          最近更新 更多