如何在 MSXML6 和 C++/Delphi 中检索非终止 xsl:message



我正在使用 MSXML 6.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;

我怀疑你能用MS XML 6.0做到这一点。

像您一样,我生成了 MSXML2_Tlb.Pas 导入文件并使用与您的类似的代码 v 进行了测试。 第一个问题是德尔菲包装器组件 TDomDocument60 和 TDomDocument60 的OnReadyStateChangeOnDataAvailable事件永远不会调用 TFreeThreadedDomDocument60。

因此,我为事件接收器编写了一个 OleVariant 包装器,该包装器在运行时通过其 ConnectionPointContainer 接口连接到 DomDocument60,以获取 IConnectionPoint 并调用 。建议(( 关于这一点。 我发现在加载XML文档时,此事件接收器调用了四次,每次的DispID为-609,这是onreadystatechange(XMLDOMDocumentEvents(的DispID。 但是a(传递给我的包装器调用的参数(PDispParams(是空的,b(它的调用没有被调用ondataavailable也没有其他任何东西,特别是ontransformnode(我不知道谁的DispID(。

因此,在我看来,首先MSXML2_Tlb中的对象的事件无法正常工作,其次,没有明显的方法来捕获正在转换的XML文档的ontransformnode事件。

Fwiw,您链接的页面上的 VB 示例,

https://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltmessageencounteredeventargs%28v=vs.110%29.aspx

似乎暗示有一种方法可以从 VB 获取XsltMessageEncounteredEventArgs,但我对将 Net 库导入 Delphi 项目不够熟悉,不知道我需要导入什么才能访问它。 如果有人能告诉我,我很乐意试一试。

最新更新