Making JAXB generate an XML processing instruction

jaxb, xml, xslt

Solution

All the solutions here are pretty ugly and verbose. Simply set the line inside the `Mashaller` object specifying the additional header.

Marshaller jaxbMarshaller = ...
jaxbMarshaller.setProperty("com.sun.xml.bind.xmlHeaders", 
    "<?xml-stylesheet type='text/xsl' href='nameoffile.xsl' ?>");

This example will output an XML object to a file using a stylesheet and format the elements nicely for humans to read. The object `myXmlObject` is of class `MyXmlClass`, and will be written to `file`, formatted by a stylesheet given by `xslUrl`:

JAXBContext context = JAXBContext.newInstance(MyXmlClass.class);
Marshaller marshaller = context.createMarshaller();
//Need to use a Writer to marshal with the XSL
FileWriter fw = new FileWriter(file);
//Do this or else the XML is all one line and not human friendly...
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
        "<?xml-stylesheet type='text/xsl' href=\"" +
        xslUrl +
        "\" ?>");
marshaller.marshal(myXmlObject, fw);

Update

In recent version of JAXB we need to use property key as `com.sun.xml.internal.bind.xmlHeaders` like below.

Marshaller jaxbMarshaller = ...
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", 
    "<?xml-stylesheet type='text/xsl' href='nameoffile.xsl' ?>");

Problem

I am generating XML dynamically using JAXB. Now, I want to convert it to HTML using XSL. How can i include ``` <?xml-stylesheet type="text/xsl" href=""> ``` in the dynamically generated XML?

Original source