gpt4 book ai didi

c++ - 如何检索非终止 xsl :message in MSXML6 and C++/Delphi?

转载 作者:行者123 更新时间:2023-11-30 03:43:02 26 4
gpt4 key购买 nike

我正在使用 MSXML 6.0 解析器进行 XSL 转换并希望获取 <xsl:message terminate="no"> debug messages .从我在网上找到的内容来看,这似乎是 possible in .NET .

有没有办法在使用 COM 接口(interface)时获取消息输出(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 导入文件并使用与您的代码类似的代码进行了测试。第一个问题是 Delphi 包装器组件 TDomDocument60 和 OnReadyStateChangeOnDataAvailable 事件永远不会调用 TFreeThreadedDomDocument60。

因此,然后我为事件接收器编写了一个 OleVariant 包装器,它在运行时通过其 ConnectionPointContainer 接口(interface)连接到 DomDocument60 以获取 IConnectionPoint 并在其上调用 .Advise()。我发现在加载 XML 文档时,此事件接收器 调用了四次,每次的 DispID 都是 -609,这是 onreadystatechange(XMLDOMDocumentEvents 的)的 DispID ).但是 a) 传递给我包装器 Invoke 的 Params (PDispParams ) 是空的,并且 b) 它的 Invoke 不是为 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 项目还不够熟悉,不知道我需要导入什么才能成为能够访问它。如果有人能告诉我,我很乐意试一试。

关于c++ - 如何检索非终止 xsl :message in MSXML6 and C++/Delphi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36396392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com