我使用MSXML6.0解析器进行XSL转换,并希望获取<xsl:message terminate="no"> 调试消息。从我在网上发现的情况来看,这似乎是可能在.NET中。
在使用COM接口时是否有一种获得消息输出的方法(C++或Delphi示例代码将非常好)?
更新:
这是我用来执行XSL转换的代码(非常直接):
uses ActiveX, {...} MSXML2_TLB;
function TransformMsXmlDocument( XmlDoc, XslDoc: iXmlDomDocument2 ) : UnicodeString;
var
XslDoc2 : iXmlDomDocument;
XslTemplate : iXslTemplate;
XslProcessor : iXslProcessor;
begin
XslDoc2 := CoFreeThreadedDomDocument60.Create();
XslDoc2.Async := FALSE;
XslDoc2.Load(XslDoc);
XslTemplate := CoXslTemplate60.Create();
XslTemplate.Stylesheet := XslDoc2;
XslProcessor := XslTemplate.CreateProcessor();
XslProcessor.Input := XmlDoc;
XslProcessor.Transform();
result := XslProcessor.Output;
end;发布于 2016-04-04 13:53:33
我怀疑您是否可以用MSXML6.0来完成这个任务。
与您一样,我生成了MSXML2_Tlb.Pas导入文件,并使用与您类似的代码v进行了测试。第一个问题是德尔菲包装器组件的OnReadyStateChange和OnDataAvailable事件TDomDocument60和TFreeThreadedDomDocument60从未被调用过。
然后,我为一个事件接收器编写了一个OleVariant包装器,该接收器在运行时通过其ConnectionPointContainer接口连接到DomDocument60,以获得IConnectionPoint并调用.Advise()。我发现,当XML文档加载时,这个事件接收器会被调用四次,每次调用的DispID为-609,即DispID of onreadystatechange (of XMLDOMDocumentEvents)。但是,传递给我的包装器调用的Params (PDispParams )是空的,b)它的调用没有调用ondataavailable或其他任何东西,特别是ontransformnode (它的DispID我不知道)。
因此,在我看来,首先,MSXML2_Tlb中的对象的事件不能正常工作;其次,没有明显的方法捕捉正在转换的XML的ontransformnode事件。
Fwiw,你链接的页面上的VB例子,
这似乎意味着有一种从VB获取XsltMessageEncounteredEventArgs的方法,但是我还不太熟悉将网络库导入到Delphi项目中,以了解我需要导入什么才能访问它。如果有人能告诉我,我很乐意试一试。
https://stackoverflow.com/questions/36396392
复制相似问题