2010-01-28 13 views

Respuesta

4

Se puede usar un StringWriter escribir primero la información de estilo en ella, y luego reunir el objeto en él:

StringWriter writer = new StringWriter(); 
//add processing instructions "by hand" with escaped quotation marks 
//or single marks 
writer.println("<?xml version='1.0'?>"); 
writer.println("<?xml-stylesheet type=\"text/xsl\" href=\"\">"); 

//create and configure marshaller to leave out processing instructions 
Marshaller marshaller = context.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

//marshal to the StringWriter 
marshaller.marshal(someObject,writer); 
//get the string representation 
String str = writer.toString(); 

Por supuesto también se puede imprimir directamente en cualquier otro flujo de salida que desee, por ejemplo, archivos o Sytstem.out.

2

Ver cómo se hace en rexsl-core, parte de ReXSL marco XSL/JAXB/JAX-RS: XslResolver:

final String header = String.format(
    "\n<?xml-stylesheet type='text/xsl' href='%s'?>", 
    StringEscapeUtils.escapeXml("my-stylesheet.xsl") 
); 
marshaller.setProperty("com.sun.xml.bind.xmlHeaders", header); 
1
JAXBContext jaxbContext; 
try { 
     jaxbContext = JAXBContext.newInstance(new Class[] {SomeObject.class}); 

     StringWriter writer = new StringWriter(); 
     writer.write("<?xml version='1.0'?>"); 
     writer.write("\n"); 
     writer.write("<?xml-stylesheet type=\"text/xsl\" href=\"\">"); 
     writer.write("\n"); 

     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
     jaxbMarshaller.marshal(someobject, writer); 
} 
+4

Intenta responder en palabras y no solo en el código. Y dado que respondes tan tarde, ¿cómo difiere tu respuesta de las otras? –

+0

Esto parece ser una solución. –

9

Todas las soluciones aquí son bastante feo y detallado. Simplemente configure la línea dentro del objeto Mashaller especificando el encabezado adicional.

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

Este ejemplo generará un objeto XML en un archivo utilizando una hoja de estilo y formateará los elementos para que los humanos los lean. El objeto de la clase myXmlObject es MyXmlClass, y se escribirá en file, formateado en una hoja de estilo dada por 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); 
+0

Esta es la forma elegante de hacerlo, pero no funcionará si está haciendo 'mariscal()' en un 'Archivo' (por ejemplo). Requiere que la salida sea un Writer o Stream. Una vez que esté al tanto de esto, debería ser simple asunto envolver su 'Archivo' en un' FileWriter'. –

+0

@KevinSadler ¡Por favor, no dude en actualizar mi respuesta! –

+0

@KevinSadler Su edición ha sido rechazada por la comunidad. Agregué la edición, pero ha sido fea. Por favor, embellecerlo de tal manera que la edición estará vinculada a usted! ¡Gracias! –

Cuestiones relacionadas