Заставить JAXB сгенерировать инструкцию обработки XML - PullRequest
7 голосов
/ 28 января 2010

Я генерирую XML динамически, используя JAXB.

Теперь я хочу преобразовать его в HTML, используя XSL. Как я могу включить

<?xml-stylesheet type="text/xsl" href=""> 

в динамически генерируемом XML?

Ответы [ 4 ]

10 голосов
/ 26 сентября 2013

Все решения здесь довольно уродливы и многословны. Просто установите строку внутри объекта Mashaller, указав дополнительный заголовок.

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

Этот пример выведет объект XML в файл с использованием таблицы стилей и отформатирует элементы, удобные для чтения людьми. Объект myXmlObject относится к классу MyXmlClass и будет записан в file, отформатированный с помощью таблицы стилей, заданной 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);
4 голосов
/ 31 января 2010

Вы можете использовать StringWriter, чтобы сначала записать в него информацию таблицы стилей, а затем упорядочить объект:

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();

Конечно, вы также можете напрямую печатать в любой другой поток вывода, например. файлы или Sytstem.out.

2 голосов
/ 30 октября 2012

Посмотрите, как это делается в rexsl-core , часть инфраструктуры ReXSL 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 голос
/ 05 ноября 2012
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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...