C++ 如何在MSXML6和C++/德尔菲?

C++ 如何在MSXML6和C++/德尔菲?,c++,xml,delphi,xslt,C++,Xml,Delphi,Xslt,我正在使用MSXML 6.0解析器进行XSL转换,并希望获取。从我在网上发现的情况来看,这似乎是 当使用COM接口时,有没有一种方法可以获得消息输出(C++或Delphi示例代码会更好) 更新: 这是我用来进行XSL转换的代码(非常简单): 我怀疑你能用MSXML6.0做到这一点 和您一样,我生成了MSXML2_Tlb.Pas导入文件,并使用代码v进行了测试。和你的差不多。第一个问题是Delphi包装器组件TDomDocument60和TDomDocument60的OnReadyStateCha

我正在使用MSXML 6.0解析器进行XSL转换,并希望获取
。从我在网上发现的情况来看,这似乎是

当使用COM接口时,有没有一种方法可以获得消息输出(C++或Delphi示例代码会更好)

更新:

这是我用来进行XSL转换的代码(非常简单):


我怀疑你能用MSXML6.0做到这一点

和您一样,我生成了MSXML2_Tlb.Pas导入文件,并使用代码v进行了测试。和你的差不多。第一个问题是Delphi包装器组件TDomDocument60和TDomDocument60的
OnReadyStateChange
OnDataAvailable
事件 永远不会调用TFreeThreadedDomDocument60

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

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

Fwiw,链接页面上的VB示例


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

首先,XSLT1.0、
XslTransform
xslcomiledtransform
的.NET实现是纯托管实现,与各种MSXML版本没有任何关系。对于一个MSXML 6和C++的例子,我没有一个,但是也许微软的代码> MSXSL< /COD>命令行工具的源代码有代码,所以我会尝试去看看。请把你的Q添加到确切的德尔菲法(如果有的话)。您正在使用来执行转换?@MartinHonnen:我测试了
msxsl.exe
命令行工具,但显然它不处理
命令:当我将它们添加到XSL时,屏幕上不会打印任何内容。使用
terminate=“yes”
时,命令终止,错误字符串包含我的消息。我也快速查看了资料来源,但找不到相关信息。好的,谢谢你深入了解。我不打算将整个项目从本机代码转换为托管代码(.NET),这将是使用
XsltMessageEncounteredEventArgs
类的要求。谢谢。事实上,我已经取得了一些进展,但还没有解决方案。我在这里偶然发现了一个“重要”的提示:我尝试过使用MSXML3而不是MSXML6。至少在v.3中,ontransformnode事件会触发,但我还没有从传递给该事件的参数中获得任何有用的信息。如果我有进一步的进展,我会更新我的答案。
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;