我正在使用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 ++运行时错误。
答案 0 :(得分:-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 ++答案。