我经常在应用程序中使用HTML输出,到目前为止我已经使用了一些简单的例程来构建HTML字符串。我现在想尝试一些不同的东西:
我想将数据序列化为XML,并提供一些XSLT模板来生成webbrowser控件的HTML。我让它静态工作(通过编写XSL慢慢挖掘),但我需要动态更改XSL文档的一些属性:过滤器,路径等,以跟随当前的UI选择。
数据足够小,以至于更改时的XML序列化不应成为问题。我想使用“静态”外部XSL文件(以便用户可以在一定程度上自定义输出),但需要调整。
我的问题:
这个想法在技术上是否合理? 我可以使用XML和XSL文档动态提供Web浏览器控件吗? 我可以动态修改XSL中的选定路径元素和属性(即不生成新文件)吗? 如何在Web浏览器控件中执行此操作? (一些指导我开始会很好..)
[编辑]感谢大家,它正在运作:D [/ edit]
答案 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)