3

私は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
}

このコードは機能しますが、変換が失敗した場合、どこで、またはなぜ失敗したかについての情報を取得する方法がわかりません-現時点では、HRESULTが失敗した(複数のインクルードを持つ複雑なXSLTで)失敗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はHRESULTS_FALSEで失敗し、解析エラーがなかったことを示します。 このページでは、エラーには解析エラーと実行時エラーの2種類があることがわかります。両方を処理する方法を示していますが、JavaScript指向のようです。私の場合、C++ランタイムエラーはスローされません。

4

1 に答える 1

-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++ の答えが見つかることを願っています。

于 2011-08-19T17:27:43.723 に答える