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
}

此代码有效,但是如果转换失败,那么我不知道如何获取有关它失败的位置或原因的任何信息 - 目前它失败(在具有多个包含的复杂 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++ 运行时错误。

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 回答