CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3
  1. #1
    Join Date
    Sep 2002
    Posts
    8

    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.

  2. #2
    Join Date
    Sep 2002
    Posts
    8
    you can get online help :on line help

  3. #3
    Join Date
    Sep 2002
    Posts
    8
    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
  •  





Click Here to Expand Forum to Full Width

Featured