2010-01-28 77 views
7

我正在使用JAXB動態生成XML。使JAXB生成XML處理指令

現在,我想使用XSL將其轉換爲HTML。我如何能包括

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

在動態生成的XML?

+0

你的意思是你想包括在JAXB輸出樣式表的參考? – skaffman 2010-01-28 08:45:01

回答

4

你可以使用的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

看看它是如何在做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
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

請嘗試用文字回答,而不是用代碼回答。既然你這麼晚回答,你的答案與其他答案有什麼不同? – 2012-11-05 13:38:15

+0

這似乎是一種解決方法。 – 2017-03-07 13:47:58

9

這裏所有的解決方案是很醜陋和冗長。只需在指定附加標頭的Mashaller對象內設置該行即可。

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

本示例將使用樣式表將一個XML對象輸出到一個文件中,並很好地將這些元素的格式設置爲供人類閱讀。對象myXmlObjectMyXmlClass類的,並會被寫入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); 
+0

這是實現它的優雅方式,但是如果你正在對'File'(例如)執行'marshal()',它將不起作用。它需要輸出爲Writer或Stream。一旦你意識到這一點,將'File'包裝在'FileWriter'中應該很簡單。 – 2013-11-04 15:11:42

+0

@KevinSadler請隨時更新我的​​答案! – 2014-05-06 10:43:03

+0

@KevinSadler您的修改已被社區拒絕。我添加了編輯,但它已經很糟糕。請美化它,以便編輯將與您聯繫!謝謝! – 2014-05-13 07:46:52