Search code examples
c++xsl-fomsxml

The element 'xsl:stylesheet' is used but not declared in the DTD/Schema


I'm trying to convert an XSL-FO document to HTML using the "fo2html.xsl" file from RenderX. That was the suggestion from this StackOverflow post: Converting XSL-FO to HTML

I'm using the load() method, and it works on everything up until loading the "fo2html.xsl" file.

            hr = pXMLDoc->load(vSource, &vbResult);

The IXMLDOMParseError object is telling me that it's line 24 of the XML that is the problem.

<!DOCTYPE xsl:stylesheet [
  <!ENTITY anchor "<xsl:apply-templates select='@id' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>">
  <!ENTITY add-style "<xsl:call-template name='add-style-attribute' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>">
]>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                exclude-result-prefixes="fo">

Line 24 is the last line of the above XML. The error source is returning exclude-result-prefixes="fo">, and the reason is:

The element 'xsl:stylesheet' is used but not declared in the DTD/Schema

I've tried pDoc2->put_resolveExternals(VARIANT_TRUE); and pDoc2->setProperty(L"ProhibitDTD", v);, but neither changed anything.

What do I need to do to load "fo2html.xsl" using MSXML?

Thanks!


Solution

  • You could try adding an XML declaration (see https://www.w3.org/TR/REC-xml/#sec-prolog-dtd) that indicates that the document is standalone:

    <?xml version="1.0" standalone="yes" ?>
    

    Alternatively, you might need to expand the entities yourself and get rid of the DOCTYPE declaration so there's no schema in the file.