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' ?>");
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…