我正在使用 IXMLDOMDocument::transformNode
使用看起来有点像这样的 C++ 代码应用 XSLT 转换:
CComPtr<IXMLDOMDocument2> spXMLDoc;
// load spXMLDoc
CComPtr<IXMLDOMDocument2> spXSLDoc;
// load spXSLDoc
BSTR *pResult;
HRESULT hr = spXMLDoc->transformNode( spXSLDoc, pResult );
if (FAILED(hr))
{
// Handle me
}
此代码有效,但是如果转换失败,那么我不知道如何获取有关它失败的位置或原因的任何信息 - 目前它正在失败(在具有多个包含的复杂 XSLT 上) 的 HRESULT 为 E_FAIL
- 有什么方法可以让我了解更多有关其失败原因的详细信息?
我已经尝试使用 parseError
属性来获取更多错误详细信息:
IXMLDOMParseError *parseError = NULL;
hr = spXMLDoc->get_parseError(&parseError);
if ( !FAILED( hr ) )
{
long errorCode = 0;
hr = parseError->get_errorCode(&errorCode);
// etc...
对 get_parseError
的调用成功,但是对 get_errorCode
的调用失败并返回 HRESULT S_FALSE
,表明没有解析错误。 This page告诉我有两种类型的错误——解析错误和运行时错误。它展示了如何处理这两者,但似乎是面向 JavaScript 的——在我的例子中,没有抛出 C++ 运行时错误。
最佳答案
抱歉,我不确定是否来自 C++。您可以尝试快速命令行转换来帮助查找 XSLT 中的错误。 XSL 将加载但无法转换的位置存在许多错误。例如,在 XSL 文件中的某处弹出 an 以触发此类错误。
这是一个示例命令行转换工具。写入 transform.js 并从命令行运行 cscript.exe transform.js
var strDOMObject = "MSXML2.FreeThreadedDOMDocument";
var strHTTPObject = "MSXML2.XMLHTTP";
var strTemplateObject = "MSXML2.XSLTemplate";
function transform( xml, xsl ) {
var xslt = new ActiveXObject( strTemplateObject );
var xmlReturn = new ActiveXObject( strDOMObject );
var xslProc;
try {
xslt.stylesheet = xsl;
} catch( e ) {
throw e;
}
xslProc = xslt.createProcessor();
xslProc.input = xml;
xslProc.transform();
return xslProc.output;
}
try {
var xml = new ActiveXObject( strDOMObject );
xml.load( "id.xml" );
var xsl = new ActiveXObject( strDOMObject );
xsl.load( "id.xsl" );
WScript.Echo( transform( xml, xsl ) );
} catch( err ) {
WScript.Echo (err.description );
}
希望这对您有所帮助,并且您可以找到 C++ 答案。
关于c++ - 从 IXMLDOMDocument::transformNode 函数获取运行时错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7124363/