|
-
December 3rd, 2003, 09:12 PM
#1
about vc++ and xml and xsl problem,please come in
my friends,
i use vc++ to develop xml and xsl program,use xsl to transform xml ,then get the transformed result.if you know xsl,you can know that xsl can set parameter into it.porgram look like this:
var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
var xslProc;
xslDoc.async = false;
xslDoc.load("sample.xsl");
xslt.stylesheet = xslDoc;
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
xmlDoc.async = false;
xmlDoc.load("books.xml");
xslProc = xslt.createProcessor();
xslProc.input = xmlDoc;
xslProc.addParameter("param1", "Hello");
xslProc.transform();
alert(xslProc.output);
this is script .you can note "xslProc.addParameter("param1", "Hello");",it can add parameter to xsl.when i use vc++ write this code ,it success.that is ,i can add parameter to it.but parameter only string ,ms help like this:
Microsoft XML Core Services (MSXML) 4.0 - DOM Reference
[C/C++]
C/C++ Syntax
HRESULT addParameter (BSTR baseName, VARIANT parameter, BSTR
namespaceURI);
Parameters
baseName [in]
The name that will be used inside the style sheet to identify the parameter context.
parameter [in]
A number, Boolean, string, node list, or node. Passing in a single node will produce a node list that contains one node (shortcut). To remove a parameter previously added to the processor, you can pass a value of VT_EMPTY, VT_NULL, or a NULL IDispatch or IUnknown instead. This acts as a signal to the processor to remove any previously added parameter of the same name.
namespaceURI [in, optional]
An optional namespace.
you can note :it can add A number, Boolean, string, node list, or node,but i do not know how to add nodelist to it.i need you help,thanks a lot.if you know ,let me know too. my email:[email protected] again.
-
December 3rd, 2003, 09:23 PM
#2
you can get online help :on line help
-
December 3rd, 2003, 11:59 PM
#3
I have got the answer!!!!! it's interface as param:
// xslSetParamTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
char* XQ_ConvertBSTRToString(BSTR pSrc);
int checkParseError(MSXML2::IXMLDOMParseErrorPtr pError);
void dump_com_error(_com_error &e);
int main(int argc, char* argv[])
{
CoInitialize(NULL);
HRESULT hr;
try{
BOOL bResult = FALSE;
short sResult = FALSE;
MSXML2::IXMLDOMDocument2Ptr pStyleSheet=NULL;
MSXML2::IXSLTemplatePtr pIXSLTemplate=NULL;
MSXML2::IXSLProcessorPtr pXSLProcessor=NULL;
hr = pIXSLTemplate.CreateInstance(__uuidof(MSXML2::XSLTemplate40));
hr=pStyleSheet.CreateInstance(__uuidof(MSXML2::FreeThreadedDOMDocument40));
pStyleSheet->async = VARIANT_FALSE;
hr=pStyleSheet->load("E:\\temp\\н¨Îļþ¼Ð\\test122.xsl");
//check on the parser error
if(hr!=VARIANT_TRUE)
{
return checkParseError(pStyleSheet->parseError);
}
pIXSLTemplate->stylesheet = pStyleSheet.GetInterfacePtr();
pXSLProcessor = pIXSLTemplate->createProcessor();
MSXML2::IXMLDOMDocumentPtr pInputDoc;
MSXML2::IXMLDOMDocumentPtr pData;
MSXML2::IXMLDOMNode *pIXMLDOMNodeTemp = NULL;
hr=pData.CreateInstance(__uuidof(MSXML2: OMDocument40));
pData->async = VARIANT_FALSE;
pData->load("E:\\temp\\н¨Îļþ¼Ð\\test123.xml");
IXMLDOMNodeList* pNodeList;
MSXML2::IXMLDOMNodeListPtr NodeListPtr;
NodeListPtr=pData->selectNodes("Slot");
NodeListPtr->QueryInterface(IID_IXMLDOMNodeList,(void **)&pNodeList);
hr = pInputDoc.CreateInstance(__uuidof(MSXML2: OMDocument40));
pInputDoc->async = VARIANT_FALSE;
hr = pInputDoc->load("E:\\temp\\н¨Îļþ¼Ð\\test16.xml");
//check on the parser error
if(hr!=VARIANT_TRUE)
{
return checkParseError(pInputDoc->parseError);
}
pInputDoc->async = VARIANT_FALSE;
pXSLProcessor->input = pInputDoc.GetInterfacePtr();
MSXML2::IXMLDOMNodeListPtr pnl = pData->getElementsByTagName("Slot");
// IXMLDOMNodeList list=pInputDoc->selectNodes("//form[*]/*");
hr=pXSLProcessor->addParameter("product_bean",_variant_t(pNodeList), "");
VARIANT_BOOL vtRet = pXSLProcessor->transform();
if(vtRet != VARIANT_TRUE)
{
MessageBox(NULL, "transformation failed","Error", MB_OK);
return -1;
}
char* p=NULL;
_bstr_t bstrOutput = pXSLProcessor->Getoutput();
p=XQ_ConvertBSTRToString(bstrOutput);
FILE *fp = fopen ("c:\\test.htm","w");
fprintf (fp,"%s",p);
fclose(fp);
delete [] p;
p=NULL;
MessageBox(NULL, bstrOutput,"Transformed Output", MB_OK);
}
catch(_com_error &e)
{
dump_com_error(e);
}
return 0;
}
int checkParseError(MSXML2::IXMLDOMParseErrorPtr pError)
{
_bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("\n")+ _bstr_t(pError->Getreason());
MessageBox(NULL,parseError, "Parse Error",MB_OK);
return -1;
}
void dump_com_error(_com_error &e)
{
printf("Error\n");
printf("\a\tCode = %08lx\n", e.Error());
printf("\a\tCode meaning = %s", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
}
/* HRESULT hr;
MSXML2::IXMLDOMDocument2 * pXMLDoc;
IXMLDOMNode * pXDN;
IXMLDOMNodeList * pNodeList;
IXSLProcessor* pXSLProcessor=NULL;
//...
hr = CoInitialize(NULL);
hr = CoCreateInstance(CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument2, (void**)&pXMLDoc);
hr = pXMLDoc->QueryInterface(IID_IXMLDOMNode, (void **)&pXDN);
pXMLDoc->loadXML("E:\\temp\\н¨Îļþ¼Ð\\test16.xml");
hr = pXMLDoc->QueryInterface(IID_IXMLDOMNodeList, (void **)&pNodeList);
IXSLTemplate* pXslT;
hr = CoCreateInstance(CLSID_XSLTemplate, NULL, CLSCTX_INPROC_SERVER,
IID_IXSLTemplate, (void**)&pXslT);
pXslT->createProcessor(&pXSLProcessor);
pXSLProcessor->put_input(pXMLDoc->ge);
pXSLProcessor->addParameter("product_bean",,"");
*/
//------------------------//
// Convert BSTR to char * //
//------------------------//
char* XQ_ConvertBSTRToString(BSTR pSrc)
{
if(!pSrc) return NULL;
DWORD cb,cwch = ::SysStringLen(pSrc);//convert even embeded NULL
char *szOut = NULL;
if(cb = ::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch + 1, NULL, 0, 0, 0))
{
szOut = new char[cb];
if(szOut)
{
szOut[cb - 1] = '\0';
if(!::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch + 1, szOut, cb, 0, 0))
{
delete []szOut;//clean up if failed;
szOut = NULL;
}
}
}
return szOut;
};
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|