Nikolay Sivov : msxml3: Respect stylesheet output mode when dumping resulting document.
Alexandre Julliard
julliard at winehq.org
Thu Mar 13 14:40:35 CDT 2014
Module: wine
Branch: master
Commit: 02af74400ff2b4762e589e5f3f4d14fe20a461c4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=02af74400ff2b4762e589e5f3f4d14fe20a461c4
Author: Nikolay Sivov <nsivov at 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\" >"
+"<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();
More information about the wine-cvs
mailing list