- if (runparams.flavor == OutputParams::XML)
- os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
-
- // FIXME UNICODE
- os << "<!DOCTYPE " << from_ascii(top_element) << ' ';
-
- // FIXME UNICODE
- if (! tclass.class_header().empty())
- os << from_ascii(tclass.class_header());
- else if (runparams.flavor == OutputParams::XML)
- os << "PUBLIC \"-//OASIS//DTD DocBook XML V4.2//EN\" "
- << "\"https://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd\"";
- else
- os << " PUBLIC \"-//OASIS//DTD DocBook V4.2//EN\"";
-
- docstring preamble = params().preamble;
- if (runparams.flavor != OutputParams::XML ) {
- preamble += "<!ENTITY % output.print.png \"IGNORE\">\n";
- preamble += "<!ENTITY % output.print.pdf \"IGNORE\">\n";
- preamble += "<!ENTITY % output.print.eps \"IGNORE\">\n";
- preamble += "<!ENTITY % output.print.bmp \"IGNORE\">\n";
- }
-
- string const name = runparams.nice
- ? changeExtension(absFileName(), ".sgml") : fname;
- preamble += features.getIncludedFiles(name);
- preamble += features.getLyXSGMLEntities();
-
- if (!preamble.empty()) {
- os << "\n [ " << preamble << " ]";
- }
- os << ">\n\n";
+ // XML preamble, no doctype needed.
+ // Not using XMLStream for this, as the root tag would be in the tag stack and make troubles with the error
+ // detection mechanisms (these are called before the end tag is output, and thus interact with the canary
+ // parsep in output_docbook.cpp).
+ os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ << "<!-- This DocBook file was created by LyX " << lyx_version
+ << "\n See https://www.lyx.org/ for more information -->\n";
+
+ // Prepare the name space declaration for MathML depending on document preferences.
+ string mathmlNamespace;
+ if (params().docbook_mathml_prefix != BufferParams::NoPrefix) {
+ string mathmlPrefix;
+ if (params().docbook_mathml_prefix == BufferParams::MPrefix)
+ mathmlPrefix = "m";
+ else if (params().docbook_mathml_prefix == BufferParams::MMLPrefix)
+ mathmlPrefix = "mml";
+ mathmlNamespace = + " xmlns:" + mathmlPrefix + "=\"http://www.w3.org/1998/Math/MathML\"";
+ }
+
+ // Directly output the root tag, based on the current type of document.
+ string languageCode = params().language->code();
+ string params = "xml:lang=\"" + languageCode + '"'
+ + " xmlns=\"http://docbook.org/ns/docbook\""
+ + " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
+ + mathmlNamespace
+ + " xmlns:xi=\"http://www.w3.org/2001/XInclude\""
+ + " version=\"5.2\"";
+
+ os << "<" << from_ascii(tclass.docbookroot()) << " " << from_ascii(params) << ">\n";