msxml3: Respect stylesheet output mode when dumping resulting document.

oldstable
Nikolay Sivov 2014-03-13 15:31:41 +04:00 committed by Alexandre Julliard
parent 28cc0b8bc1
commit 02af74400f
3 changed files with 50 additions and 22 deletions

View File

@ -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)

View File

@ -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);
}

View File

@ -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();