2

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

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

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

我的问题:

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

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

4

3 回答 3

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 技术,就像页面在普通浏览器中显示时一样。那是一袋完全不同的香蕉。

于 2009-01-25T19:16:52.517 回答
3

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

当然,如果您有勇气,您可以使用 xslt 动态地编写 xslt - 不过,这并不简单。

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

于 2009-01-25T12:20:12.210 回答
1

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

关于你的其他问题:

您可以转换内存中的数据并将其加载到 Web 浏览器控件中。否则,您需要将数据保存到临时文件中。

您可以在运行时使用 XSLT 参数进行选择

于 2009-01-25T10:03:33.297 回答