pet*_*hen 2 c# xml xslt webbrowser-control
我经常在应用程序中使用HTML输出,到目前为止我已经使用了一些简单的例程来构建HTML字符串.我现在想尝试一些不同的东西:
我想将数据序列化为XML,并提供一些XSLT模板来生成webbrowser控件的HTML.我让它静态工作(通过编写XSL慢慢挖掘),但我需要动态更改XSL文档的一些属性:过滤器,路径等,以跟随当前的UI选择.
数据足够小,以至于更改时的XML序列化不应成为问题.我想使用"静态"外部XSL文件(以便用户可以在一定程度上自定义输出),但需要调整.
我的问题:
这个想法在技术上是否合理?
我可以使用XML和XSL文档动态提供Web浏览器控件吗?我可以动态修改XSL中的选定路径元素和属性(即不生成新文件)吗?如何在Web浏览器控件中执行此操作?(一些让我入门的指针会很好..)
[编辑]感谢大家,它的工作:D [/ edit]
通常的方法是在运行时为变换提供参数并编写变换,以便其行为由参数控制.
通常当我这样做时,我只传入一个参数 - 一个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">
Run Code Online (Sandbox Code Playgroud)
等等.
使用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();
}
Run Code Online (Sandbox Code Playgroud)
如果用户正在更新的UI位于WebBrowser本身(即HTML页面包含HTML UI控件),则应使用动态HTML技术,就像在普通浏览器中显示页面时一样.那是一包完整不同的香蕉.