Здравствуйте, 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)
{
}