Module: wine Branch: master Commit: 02af74400ff2b4762e589e5f3f4d14fe20a461c4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=02af74400ff2b4762e589e5f3f...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Mar 13 15:31:41 2014 +0400
msxml3: Respect stylesheet output mode when dumping resulting document.
---
dlls/msxml3/main.c | 2 ++ dlls/msxml3/node.c | 31 +++++++++---------------------- dlls/msxml3/tests/domdoc.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 22 deletions(-)
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c index 1381904..5967ac0 100644 --- a/dlls/msxml3/main.c +++ b/dlls/msxml3/main.c @@ -173,6 +173,7 @@ DECL_FUNCPTR(xsltFreeTransformContext); DECL_FUNCPTR(xsltNewTransformContext); DECL_FUNCPTR(xsltParseStylesheetDoc); DECL_FUNCPTR(xsltQuoteUserParams); +DECL_FUNCPTR(xsltSaveResultTo); # undef DECL_FUNCPTR #endif
@@ -197,6 +198,7 @@ static void init_libxslt(void) LOAD_FUNCPTR(xsltNewTransformContext, 1); LOAD_FUNCPTR(xsltParseStylesheetDoc, 1); LOAD_FUNCPTR(xsltQuoteUserParams, 1); + LOAD_FUNCPTR(xsltSaveResultTo, 1); #undef LOAD_FUNCPTR
if (pxsltInit) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index aee38e0..e3016a5 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -67,6 +67,7 @@ MAKE_FUNCPTR(xsltFreeTransformContext); MAKE_FUNCPTR(xsltNewTransformContext); MAKE_FUNCPTR(xsltParseStylesheetDoc); MAKE_FUNCPTR(xsltQuoteUserParams); +MAKE_FUNCPTR(xsltSaveResultTo); # undef MAKE_FUNCPTR #endif
@@ -1058,30 +1059,16 @@ HRESULT node_transform_node_params(const xmlnode *This, IXMLDOMNode *stylesheet, { const xmlChar *content;
- if(result->type == XML_HTML_DOCUMENT_NODE) + xmlOutputBufferPtr output = xmlAllocOutputBuffer(NULL); + if (output) { - xmlOutputBufferPtr output = xmlAllocOutputBuffer(NULL); - if (output) - { + if(result->type == XML_HTML_DOCUMENT_NODE) htmldoc_dumpcontent(output, result->doc); - content = get_output_buffer_content(output); - *p = bstr_from_xmlChar(content); - xmlOutputBufferClose(output); - } - } - else - { - xmlBufferPtr buf = xmlBufferCreate(); - if (buf) - { - int size = xmlNodeDump(buf, NULL, (xmlNodePtr)result, 0, 0); - if(size > 0) - { - content = xmlBufferContent(buf); - *p = bstr_from_xmlChar(content); - } - xmlBufferFree(buf); - } + else + pxsltSaveResultTo(output, result->doc, xsltSS); + content = get_output_buffer_content(output); + *p = bstr_from_xmlChar(content); + xmlOutputBufferClose(output); } xmlFreeDoc(result); } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index b5e7441..79805cc 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -11659,6 +11659,32 @@ static const char xsltext_xsl[] = "</xsl:template>" "</xsl:stylesheet>";
+static const char omitxmldecl_xsl[] = +"<?xml version=\"1.0\"?>" +"<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform%5C" >" +"<xsl:output method="xml" omit-xml-declaration="yes"/>" +"<xsl:template match="/">" +" <xsl:for-each select="/a/item">" +" <xsl:element name="node">" +" <xsl:value-of select="@name"/>" +" </xsl:element>" +" </xsl:for-each>" +"</xsl:template>" +"</xsl:stylesheet>"; + +static const char omitxmldecl_doc[] = +"<?xml version=\"1.0\"?>" +"<a>" +" <item name="item1"/>" +" <item name="item2"/>" +"</a>"; + +static const char omitxmldecl_result[] = +"<node>item1</node><node>item2</node>"; + +static const char omitxmldecl_result2[] = +"<node>item1</node><node>item2</node>\n"; + static void test_xsltext(void) { IXMLDOMDocument *doc, *doc2; @@ -11680,6 +11706,19 @@ static void test_xsltext(void) ok(!lstrcmpW(ret, _bstr_("testdata")), "transform result %s\n", wine_dbgstr_w(ret)); SysFreeString(ret);
+ /* omit-xml-declaration */ + hr = IXMLDOMDocument_loadXML(doc, _bstr_(omitxmldecl_xsl), &b); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IXMLDOMDocument_loadXML(doc2, _bstr_(omitxmldecl_doc), &b); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXMLDOMDocument_transformNode(doc2, (IXMLDOMNode*)doc, &ret); + ok(hr == S_OK, "got 0x%08x\n", hr); + /* Old enough libxslt places extra '\n' at the end of the output. */ + ok(!lstrcmpW(ret, _bstr_(omitxmldecl_result)) || + !lstrcmpW(ret, _bstr_(omitxmldecl_result2)), "transform result %s\n", wine_dbgstr_w(ret)); + SysFreeString(ret); + IXMLDOMDocument_Release(doc2); IXMLDOMDocument_Release(doc); free_bstrs();