DocumentImpl* XSLTProcessorImpl::documentFromXMLDocPtr(xmlDocPtr resultDoc, xsltStylesheetPtr sheet) { // FIXME: For now we serialize and then reparse. It might be more optimal to write a DOM // converter. if (!resultDoc || !sheet) return 0; DocumentImpl* result = 0; xmlOutputBufferPtr outputBuf = xmlAllocOutputBuffer(NULL); if (outputBuf) { outputBuf->context = this; outputBuf->writecallback = bufferWrite; if (xsltSaveResultTo(outputBuf, resultDoc, sheet) < 0) return 0; // There are three types of output we need to be able to deal with: // HTML (create an HTML document), XML (create an XML document), and text (wrap in a <pre> and // make an XML document). KHTMLView* view = m_sourceDocument->view(); const xmlChar* method; XSLT_GET_IMPORT_PTR(method, sheet, method); if (method == NULL && resultDoc->type == XML_HTML_DOCUMENT_NODE) method = (const xmlChar*)"html"; if (xmlStrEqual(method, (const xmlChar*)"html")) result = m_sourceDocument->implementation()->createHTMLDocument(view); else result = m_sourceDocument->implementation()->createDocument(view); result->attach(); result->setURL(m_sourceDocument->URL()); result->setBaseURL(m_sourceDocument->baseURL()); result->setDecoder(m_sourceDocument->decoder()); // FIXME: Should just be UTF-16. result->docLoader()->setShowAnimations(m_sourceDocument->docLoader()->showAnimations()); result->setTransformSourceDocument(m_sourceDocument); if (xmlStrEqual(method, (const xmlChar*)"text")) { // Modify the output so that it is a well-formed XHTML document with a <pre> tag enclosing // the text. QString beforeString("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<body>\n<pre>\n<![CDATA["); QString afterString("]]>\n</pre>\n</body>\n</html>\n"); m_resultOutput = beforeString + m_resultOutput + afterString; } // Before parsing, we need to detach the old document completely and get the new document // in place. We have to do this only if we're rendering the result document. if (view) { view->clear(); view->part()->replaceDocImpl(result); } result->open(); result->determineParseMode(m_resultOutput); // Make sure we parse in the correct mode. result->write(m_resultOutput); result->finishParsing(); if (view) view->part()->checkCompleted(); else result->close(); // FIXME: Even viewless docs can load subresources. onload will fire too early. // This is probably a bug in XMLHttpRequestObjects as well. } return result; }
static inline String resultMIMEType(xmlDocPtr resultDoc, xsltStylesheetPtr sheet) { // There are three types of output we need to be able to deal with: // HTML (create an HTML document), XML (create an XML document), // and text (wrap in a <pre> and create an XML document). const xmlChar* resultType = 0; XSLT_GET_IMPORT_PTR(resultType, sheet, method); if (!resultType && resultDoc->type == XML_HTML_DOCUMENT_NODE) resultType = (const xmlChar*)"html"; if (xmlStrEqual(resultType, (const xmlChar*)"html")) return "text/html"; if (xmlStrEqual(resultType, (const xmlChar*)"text")) return "text/plain"; return "application/xml"; }
xsltStylesheetPtr parse_xsl( char* xsl, int iXslType ) { xsltStylesheetPtr tParsedXslt = NULL; xmlDocPtr tXSLDocument = NULL; /** Rem: For encoding */ xmlCharEncodingHandlerPtr encoder = NULL; const xmlChar *encoding = NULL; /** Act: Encoding support */ xmlInitCharEncodingHandlers( ); /** Act: Parse XSL */ if( iXslType == RUBY_XSLT_XSLSRC_TYPE_STR ) { tXSLDocument = xmlParseMemory( xsl, strlen( xsl ) ); if( tXSLDocument == NULL ) { rb_raise( eXSLTParsingError, "XSL parsing error" ); return( NULL ); } tParsedXslt = xsltParseStylesheetDoc( tXSLDocument ); } else if( iXslType == RUBY_XSLT_XSLSRC_TYPE_FILE ) { tParsedXslt = xsltParseStylesheetFile( BAD_CAST xsl ); } if( tParsedXslt == NULL ) { rb_raise( eXSLTParsingError, "XSL Stylesheet parsing error" ); return( NULL ); } /** Act: Get encoding */ XSLT_GET_IMPORT_PTR( encoding, tParsedXslt, encoding ) encoder = xmlFindCharEncodingHandler((char *)encoding); if( encoding != NULL ) { encoder = xmlFindCharEncodingHandler((char *)encoding); if( (encoder != NULL) && (xmlStrEqual((const xmlChar *)encoder->name, (const xmlChar *) "UTF-8")) ) { encoder = NULL; } } return( tParsedXslt ); }