[PATCH] Implement transformNode
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Wed Mar 26 03:52:36 CDT 2008
---
dlls/msxml3/main.c | 10 ++++++
dlls/msxml3/node.c | 62 +++++++++++++++++++++++++++++++++++-
dlls/msxml3/tests/domdoc.c | 75 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 146 insertions(+), 1 deletions(-)
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index 7f03948..ad6e311 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -35,6 +35,10 @@
#include "msxml_private.h"
+#ifdef HAVE_LIBXSLT
+#include <libxslt/xslt.h>
+#endif
+
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
static HINSTANCE hInstance;
@@ -171,10 +175,16 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
#ifdef HAVE_LIBXML2
xmlInitParser();
#endif
+#ifdef HAVE_LIBXSLT
+ xsltInit();
+#endif
hInstance = hInstDLL;
DisableThreadLibraryCalls(hInstDLL);
break;
case DLL_PROCESS_DETACH:
+#ifdef HAVE_LIBXSLT
+ xsltCleanupGlobals();
+#endif
#ifdef HAVE_LIBXML2
xmlCleanupParser();
process_detach();
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c
index ee4e1b2..d8eaafa 100644
--- a/dlls/msxml3/node.c
+++ b/dlls/msxml3/node.c
@@ -39,6 +39,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml);
#ifdef HAVE_LIBXML2
+#ifdef HAVE_LIBXSLT_TRANSFORM_H
+#include <libxslt/transform.h>
+#endif
+#include <libxslt/xsltutils.h>
+#include <libxslt/xsltInternals.h>
+
+
static const WCHAR szBinBase64[] = {'b','i','n','.','b','a','s','e','6','4',0};
static const WCHAR szString[] = {'s','t','r','i','n','g',0};
static const WCHAR szNumber[] = {'n','u','m','b','e','r',0};
@@ -1030,8 +1037,61 @@ static HRESULT WINAPI xmlnode_transformNode(
IXMLDOMNode* styleSheet,
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, result, NULL, 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;
+#endif
}
static HRESULT WINAPI xmlnode_selectNodes(
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 9c6eb66..a51697a 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -119,6 +119,35 @@ static const CHAR szExampleXML[] =
" </elem>\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[] = {
'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);
}
+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)
{
HRESULT r;
@@ -3152,6 +3226,7 @@ START_TEST(domdoc)
test_xmlTypes();
test_nodeTypeTests();
test_DocumentSaveToDocument();
+ test_testTransforms();
CoUninitialize();
}
--
1.5.4.1
--------------050407060508010301090503--
More information about the wine-patches
mailing list