msxml3: Implement transformNode.
This commit is contained in:
parent
dd66542011
commit
880bacb5f1
@ -35,6 +35,10 @@
|
|||||||
|
|
||||||
#include "msxml_private.h"
|
#include "msxml_private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBXSLT
|
||||||
|
#include <libxslt/xslt.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
|
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
|
||||||
|
|
||||||
static HINSTANCE hInstance;
|
static HINSTANCE hInstance;
|
||||||
@ -170,11 +174,17 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
|
|||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
#ifdef HAVE_LIBXML2
|
#ifdef HAVE_LIBXML2
|
||||||
xmlInitParser();
|
xmlInitParser();
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBXSLT
|
||||||
|
xsltInit();
|
||||||
#endif
|
#endif
|
||||||
hInstance = hInstDLL;
|
hInstance = hInstDLL;
|
||||||
DisableThreadLibraryCalls(hInstDLL);
|
DisableThreadLibraryCalls(hInstDLL);
|
||||||
break;
|
break;
|
||||||
case DLL_PROCESS_DETACH:
|
case DLL_PROCESS_DETACH:
|
||||||
|
#ifdef HAVE_LIBXSLT
|
||||||
|
xsltCleanupGlobals();
|
||||||
|
#endif
|
||||||
#ifdef HAVE_LIBXML2
|
#ifdef HAVE_LIBXML2
|
||||||
xmlCleanupParser();
|
xmlCleanupParser();
|
||||||
process_detach();
|
process_detach();
|
||||||
|
@ -33,6 +33,17 @@
|
|||||||
|
|
||||||
#include "msxml_private.h"
|
#include "msxml_private.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBXSLT
|
||||||
|
# ifdef HAVE_LIBXSLT_PATTERN_H
|
||||||
|
# include <libxslt/pattern.h>
|
||||||
|
# endif
|
||||||
|
# ifdef HAVE_LIBXSLT_TRANSFORM_H
|
||||||
|
# include <libxslt/transform.h>
|
||||||
|
# endif
|
||||||
|
# include <libxslt/xsltutils.h>
|
||||||
|
# include <libxslt/xsltInternals.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
|
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
|
||||||
@ -1030,8 +1041,61 @@ static HRESULT WINAPI xmlnode_transformNode(
|
|||||||
IXMLDOMNode* styleSheet,
|
IXMLDOMNode* styleSheet,
|
||||||
BSTR* xmlString)
|
BSTR* xmlString)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
#ifdef HAVE_LIBXSLT
|
||||||
|
xmlnode *This = impl_from_IXMLDOMNode( iface );
|
||||||
|
xmlnode *pStyleSheet = NULL;
|
||||||
|
xsltStylesheetPtr xsltSS = NULL;
|
||||||
|
xmlDocPtr result = NULL;
|
||||||
|
IXMLDOMNode *ssNew;
|
||||||
|
|
||||||
|
TRACE("%p %p %p\n", This, styleSheet, xmlString);
|
||||||
|
|
||||||
|
if(!styleSheet || !xmlString)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
*xmlString = NULL;
|
||||||
|
|
||||||
|
if(IXMLDOMNode_QueryInterface(styleSheet, &IID_IXMLDOMNode, (LPVOID)&ssNew) == S_OK)
|
||||||
|
{
|
||||||
|
pStyleSheet = impl_from_IXMLDOMNode( ssNew );
|
||||||
|
|
||||||
|
xsltSS = xsltParseStylesheetDoc( pStyleSheet->node->doc);
|
||||||
|
if(xsltSS)
|
||||||
|
{
|
||||||
|
result = xsltApplyStylesheet(xsltSS, This->node->doc, NULL);
|
||||||
|
if(result)
|
||||||
|
{
|
||||||
|
xmlBufferPtr pXmlBuf;
|
||||||
|
int nSize;
|
||||||
|
|
||||||
|
pXmlBuf = xmlBufferCreate();
|
||||||
|
if(pXmlBuf)
|
||||||
|
{
|
||||||
|
nSize = xmlNodeDump(pXmlBuf, NULL, (xmlNodePtr)result, 0, 0);
|
||||||
|
if(nSize > 0)
|
||||||
|
{
|
||||||
|
const xmlChar *pContent;
|
||||||
|
|
||||||
|
pContent = xmlBufferContent(pXmlBuf);
|
||||||
|
*xmlString = bstr_from_xmlChar(pContent);
|
||||||
|
|
||||||
|
xmlBufferFree(pXmlBuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IXMLDOMNode_Release(ssNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*xmlString == NULL)
|
||||||
|
*xmlString = SysAllocStringLen(NULL, 0);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
#else
|
||||||
|
FIXME("libxslt headers were not found at compile time\n");
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI xmlnode_selectNodes(
|
static HRESULT WINAPI xmlnode_selectNodes(
|
||||||
|
@ -119,6 +119,35 @@ static const CHAR szExampleXML[] =
|
|||||||
" </elem>\n"
|
" </elem>\n"
|
||||||
"</root>\n";
|
"</root>\n";
|
||||||
|
|
||||||
|
static const CHAR szTransformXML[] =
|
||||||
|
"<?xml version=\"1.0\"?>\n"
|
||||||
|
"<greeting>\n"
|
||||||
|
"Hello World\n"
|
||||||
|
"</greeting>";
|
||||||
|
|
||||||
|
static const CHAR szTransformSSXML[] =
|
||||||
|
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
|
||||||
|
" <xsl:output method=\"html\"/>\n"
|
||||||
|
" <xsl:template match=\"/\">\n"
|
||||||
|
" <xsl:apply-templates select=\"greeting\"/>\n"
|
||||||
|
" </xsl:template>\n"
|
||||||
|
" <xsl:template match=\"greeting\">\n"
|
||||||
|
" <html>\n"
|
||||||
|
" <body>\n"
|
||||||
|
" <h1>\n"
|
||||||
|
" <xsl:value-of select=\".\"/>\n"
|
||||||
|
" </h1>\n"
|
||||||
|
" </body>\n"
|
||||||
|
" </html>\n"
|
||||||
|
" </xsl:template>\n"
|
||||||
|
"</xsl:stylesheet>";
|
||||||
|
|
||||||
|
static const CHAR szTransformOutput[] =
|
||||||
|
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
|
||||||
|
"<html><body><h1>\n"
|
||||||
|
"Hello World\n"
|
||||||
|
"</h1></body></html>\n";
|
||||||
|
|
||||||
static const WCHAR szNonExistentFile[] = {
|
static const WCHAR szNonExistentFile[] = {
|
||||||
'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
|
'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
|
||||||
};
|
};
|
||||||
@ -3130,6 +3159,51 @@ static void test_DocumentSaveToDocument(void)
|
|||||||
IXMLDOMDocument_Release(doc);
|
IXMLDOMDocument_Release(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_testTransforms(void)
|
||||||
|
{
|
||||||
|
IXMLDOMDocument *doc = NULL;
|
||||||
|
IXMLDOMDocument *docSS = NULL;
|
||||||
|
IXMLDOMNode *pNode;
|
||||||
|
VARIANT_BOOL bSucc;
|
||||||
|
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
|
||||||
|
if( hr != S_OK )
|
||||||
|
return;
|
||||||
|
|
||||||
|
hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&docSS );
|
||||||
|
if( hr != S_OK )
|
||||||
|
{
|
||||||
|
IXMLDOMDocument_Release(doc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IXMLDOMDocument_loadXML(doc, _bstr_(szTransformXML), &bSucc);
|
||||||
|
ok(hr == S_OK, "ret %08x\n", hr );
|
||||||
|
|
||||||
|
hr = IXMLDOMDocument_loadXML(docSS, _bstr_(szTransformSSXML), &bSucc);
|
||||||
|
ok(hr == S_OK, "ret %08x\n", hr );
|
||||||
|
|
||||||
|
hr = IXMLDOMDocument_QueryInterface(docSS, &IID_IXMLDOMNode, (LPVOID*)&pNode );
|
||||||
|
ok(hr == S_OK, "ret %08x\n", hr );
|
||||||
|
if(hr == S_OK)
|
||||||
|
{
|
||||||
|
BSTR bOut;
|
||||||
|
|
||||||
|
hr = IXMLDOMDocument_transformNode(doc, pNode, &bOut);
|
||||||
|
ok(hr == S_OK, "ret %08x\n", hr );
|
||||||
|
ok( !lstrcmpW( bOut, _bstr_(szTransformOutput) ), "Stylesheet output not correct\n");
|
||||||
|
|
||||||
|
IXMLDOMNode_Release(pNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
IXMLDOMDocument_Release(docSS);
|
||||||
|
IXMLDOMDocument_Release(doc);
|
||||||
|
|
||||||
|
free_bstrs();
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(domdoc)
|
START_TEST(domdoc)
|
||||||
{
|
{
|
||||||
HRESULT r;
|
HRESULT r;
|
||||||
@ -3152,6 +3226,7 @@ START_TEST(domdoc)
|
|||||||
test_xmlTypes();
|
test_xmlTypes();
|
||||||
test_nodeTypeTests();
|
test_nodeTypeTests();
|
||||||
test_DocumentSaveToDocument();
|
test_DocumentSaveToDocument();
|
||||||
|
test_testTransforms();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user