Vla*_*lad 4 xml delphi xslt internet-explorer twebbrowser
在XP上,如果我想在以下位置查看XML,这段代码运行正常TWebBrowser
:
uses ComObj, MSHTML, ActiveX;
procedure DocumentFromString(ABrowser: TWebBrowser; const HTMLString: wideString);
var
v: OleVariant;
HTMLDocument: IHTMLDocument2;
begin
if not Assigned(ABrowser.Document) then
begin
ABrowser.Navigate('about:blank');
while ABrowser.ReadyState <> READYSTATE_COMPLETE do
begin
Application.ProcessMessages;
Sleep(0);
end;
end;
HTMLDocument := ABrowser.Document as IHTMLDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := HTMLString;
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
end;
procedure WebBrowserXML(ABrowser: TWebBrowser; const XmlString: WideString);
var
xml, xsl: OleVariant;
HTMLString: WideString;
begin
xml := CreateOleObject('Msxml2.DOMDocument');
xml.async := False;
xml.loadXML(XmlString);
// Assert(xml.parseError.errorCode = 0);
xsl := CreateOleObject('Msxml2.DOMDocument');
xsl.validateOnParse := False;
xsl.async := False;
xsl.load('res://msxml.dll/defaultss.xsl');
// Assert(xsl.parseError.errorCode = 0);
HTMLString := xml.transformNode(xsl);
ABrowser.HandleNeeded;
DocumentFromString(ABrowser, HTMLString);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowserXML(WebBrowser1, '<xml><node>Hello</node></xml>');
end;
Run Code Online (Sandbox Code Playgroud)
方法如下:XML用XSLT(defaultss.xsl
)转换,结果是HTML.
在Vista上我得到了一个例外xml.transformNode(xsl);
:
样式表不会占用文档元素.样式表可能是空的,或者它可能不是格式良好的XML文档
我试图从文件中直接加载我自己的XSLT副本,如下所示xsl.load('my.xsl')
:
http://forums.asp.net/t/1141304.aspx?xslt+viewing+XML+like+that+of+IE
但我仍然得到XSLT无效的相同错误.
如何让这段代码在Vista上运行?
从评论到我提供的链接:
我还发现,直接调用 res://msxml#.dll/defaultss.xsl多年后,此方法在Vista中不再有效.我搞砸了各种各样的安全设置,但这似乎不是问题.看起来我唯一的选择是发布我自己的defaultss.xsl副本.
我似乎无法提供有效的"我自己的副本" defaultss.xsl
.他们都失败了同样的异常错误.我能做什么?
该load()
文件显示,使用此URL的例子:
res://msxml3.dll/xml/defaultss.xsl
Run Code Online (Sandbox Code Playgroud)
如果您想在应用中嵌入XSLT作为资源,请确保使用res:
引用应用中该资源的URL.有关该语法,请参阅MSDN的文档:
句法
Run Code Online (Sandbox Code Playgroud)res://sFile[/sType]/sID
令牌
sFile
包含资源的模块的百分比编码路径和文件名.sType
可选.字符串或数字资源类型.这可以是自定义资源,也可以是FindResource函数可识别的预定义资源类型之一.如果指定了数字资源类型,则标识符的编号必须遵循#字符.如果未指定此参数,则默认资源类型为RT_HTML或RT_FILE.sID
资源的字符串或数字标识符.如果指定了数字标识符,则标识符的实际编号(而不是标识符本身)必须遵循#字符.
我刚刚检查了Windows 7和msxml3.dll
确实有一个XML
命名的资源DEFAULTSS.XSL
,但msxml4.dll
并msxml6.dll
没有,也没有msxml.dll
文件.
正如MSDN所说,res:
默认为HTML
或未FILE
指定资源类型,因此使用 res://msxml3.dll/defaultss.xls
将无效,因为XSLT资源类型是XML
替代的.因此,您需要使用res://msxml3.dll/xml/defaultss.xls
.
归档时间: |
|
查看次数: |
994 次 |
最近记录: |