Re[3]: xml + xslt -> html
От: Stanislav V. Zudin Россия  
Дата: 28.02.18 19:24
Оценка: 4 (1)
Здравствуйте, gok, Вы писали:

SVZ>>Один из вариантов — сгенерить xml с данными и натравить на него xslt.


gok>Т.е. это два файла надо послать юзеру.


Посылать лучше готовый результат.

gok>А как бы данные (ХМЛ) и шаблон (ХСЛТ) слить один (HTML)?


Как-то так (код древний, как работает помню смутно):
Сохранял, в зависимости от выбранного xslt, в csv, txt и html.

// ==========================================================================
namespace xml
{
    typedef MSXML2::IXMLDOMDocument            Document;
    typedef MSXML2::IXMLDOMNode                Node;
    typedef MSXML2::IXMLDOMElement            Element;

    typedef MSXML2::IXMLDOMParseErrorPtr    DOMParseErrorPtr;
    typedef MSXML2::IXMLDOMElementPtr        ElementPtr;
    typedef MSXML2::IXMLDOMAttributePtr        AttributePtr;
    typedef MSXML2::IXMLDOMDocument2Ptr        DocumentPtr;

    // ======================================================================
    DocumentPtr CreateDocument()
    {
        REFGUID clsid = __uuidof(MSXML2::DOMDocument60);//MSXML2::DOMDocument);
        DocumentPtr document(clsid);
        return document;
    }

    // ======================================================================
    DOMParseErrorPtr LoadDocument(Document* document, LPCTSTR source)
    {
        document->async = VARIANT_TRUE;// loading resources async. only! VARIANT_FALSE;
        document->resolveExternals = VARIANT_FALSE;
        document->validateOnParse = VARIANT_FALSE;
        document->load(source);
        DOMParseErrorPtr domParseError = document->parseError;
        return domParseError;
    }
}


Собственно создание документа:
    xml::DocumentPtr m_xmldoc;
    CString m_targetFname,
            m_xslPath;
...
...
    try
    {
        // LOAD XSLT STYLE DOCUMENT
        xml::DocumentPtr xsldoc = xml::CreateDocument();
        if (!xsldoc)
        {
            ASSERT(0); // Ку-ку, Гриня
            return false;
        }

        xml::DOMParseErrorPtr parseError = xml::LoadDocument(xsldoc, m_xslPath);
        if(parseError->errorCode)
        {
            CString reason(LPCWSTR(parseError->reason));
            m_pimpl->m_errString.Format(_T("Failed to load document.\n%s"), reason.GetString());
            return false;
        }

        // SAVE XML FILE NEXT TO TARGET FILE
        CString xmlfname;
        xmlfname.Format(_T("%s.xml"), m_targetFname.GetString());
        m_xmldoc->save( _variant_t(xmlfname) );

        // RUN XSLT TRANSFORMATION
        HRESULT hr = m_xmldoc->setProperty(_bstr_t(_T("AllowXsltScript")), _variant_t(true));
        hr = xsldoc->setProperty(_bstr_t(_T("AllowXsltScript")), _variant_t(true));
        _bstr_t retv = m_xmldoc->transformNode(xsldoc);
        if (retv.length() > 0)
        {
            CFile file(m_targetFname, CFile::modeCreate | CFile::modeWrite);
            file.Write(static_cast<const char*>(retv), retv.length());
            file.Close();

            // SHOW RESULT
            ::ShellExecute(AfxGetMainWnd()->GetSafeHwnd(), _T("open"), 
                           m_targetFname, NULL, NULL, SW_SHOW);
        }

        retval = true;  // DONE!
    }
    catch (_com_error& ce) 
    {

    }
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.