Получение информации об ошибках во время выполнения из функции IXMLDOMDocument::transformNode
Я использую IXMLDOMDocument::transformNode
применить XSLT-преобразование с использованием кода C++, который выглядит примерно так:
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
, указывая, что не было ошибки разбора. Эта страница сообщает мне, что существует два типа ошибок - ошибки разбора и ошибки времени выполнения. Он показывает, как справиться с обоими, но, похоже, ориентирован на JavaScript - в моем случае не возникает никаких ошибок времени выполнения C++.
1 ответ
Извините, я не уверен в C++. Вы можете попробовать быстрое преобразование командной строки, чтобы помочь найти ошибку в XSLT. Существует ряд ошибок, при которых XSL будет загружаться, но не может трансформироваться. Для примера вставьте где-нибудь в файле XSL, чтобы вызвать этот тип ошибки.
Вот пример инструмента преобразования командной строки. Запишите файл 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++.