Получение информации об ошибках во время выполнения из функции 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++.

Другие вопросы по тегам