AndresKo
AndresKo

Reputation: 1

Java - How does an xml document loads a DTD using XML Catalogs?

I want to know this so I can apply xsl transformations to the xml document without losing some entities like –

How do I tell the parser (any parser I dont care) which catalog to use and then execute the xsl transformations?, How do I connect the new configured parser to the transformation factory.

The code below represents the transformations I want to execute on the xml file (it works fine). I just want to know how can I add the XML Catalog approach so the xml-document loads correctly its DTD and continue with the xsl transformations steps.

        try {
        SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance();


        Templates step1Template = stf.newTemplates(new StreamSource(
                this.getClass().getResourceAsStream("xsltransformation_step1.xsl")
        ));

        Templates step2Template = stf.newTemplates(new StreamSource(
                this.getClass().getResourceAsStream("xsltransformation_step2.xsl")
        ));

       Templates step3Template = stf.newTemplates(new StreamSource(
               this.getClass().getResourceAsStream("xsltransformation_step3.xsl")
        ));

        TransformerHandler th1 = stf.newTransformerHandler(step1Template);
        TransformerHandler th2 = stf.newTransformerHandler(step2Template);
        TransformerHandler th3 = stf.newTransformerHandler(step3Template);

        StreamSource xmlStreamSource = new StreamSource(new File(xmlInputFile));

        StreamResult outputStreamSource1 = new StreamResult(new File (outputNewFile1));
        StreamResult outputStreamSource2 = new StreamResult(new File (outputNewFile2));

        th1.setResult(new SAXResult(th2));
        th2.setResult(new SAXResult(th3));
        th3.setResult(outputStreamSource1);

        Transformer t = stf.newTransformer();
        t.transform(xmlStreamSource, new SAXResult(th1));


    }catch (TransformerException e){
        e.printStackTrace();
        return false;
    }

This is an example of the xmlInputFile containing entities

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE manual PUBLIC '-//docufy//Docufy Standard DTD 20080125//EN' '/system/cosimago/dtd/manual.dtd'>
<chapter>
  <title>LEDs &#8222;5 &ndash; 8&#8220; am CPU-Board pr&#252;fen</title>
  <body>
   <!-- just content -->
  </body>
</chapter>

Please I would be really thankful if some good soul help me out with this.

Thank you in advance.

Andres

Upvotes: 0

Views: 187

Answers (1)

Michael Kay
Michael Kay

Reputation: 163587

It's simplest to create your own XML parser (XMLReader) using SAXTransformerFactory.newInstance(). Then set the CatalogResolver on the parser using XMLReader.setEntityResolver(). Then wrap the XMLReader in a SAXSource, and supply this as the Source object to Transformer.transform().

With Saxon it's also possible to supply the entity resolver indirectly via a configuration property, but this is much more convoluted and is only needed if you aren't able to control the creation and configuration of the XMLReader yourself.

Upvotes: 1

Related Questions