2010-01-28 31 views
7

Tôi đang tạo XML động bằng cách sử dụng JAXB.Làm cho JAXB tạo ra một lệnh xử lý XML

Bây giờ, tôi muốn chuyển đổi nó sang HTML bằng XSL. Làm cách nào tôi có thể bao gồm

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

trong XML được tạo động?

+0

Bạn có nghĩa là bạn muốn bao gồm một tài liệu tham khảo stylesheet trong đầu ra JAXB? – skaffman

Trả lời

4

Bạn có thể sử dụng một StringWriter đầu tiên ghi thông tin stylesheet vào nó, và sau đó sắp xếp các đối tượng vào nó:

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

Tất nhiên bạn cũng có thể in trực tiếp đến tất cả các dòng sản lượng khác mà bạn muốn, ví dụ tệp hoặc Sytstem.out.

2

Xem cách nó được thực hiện trong rexsl-core, một phần của ReXSL khuôn khổ 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

Hãy cố gắng trả lời bằng lời nói và không chỉ bằng mã. Và vì bạn trả lời quá muộn, câu trả lời của bạn khác với câu trả lời khác như thế nào? –

+0

Điều này có vẻ là một giải pháp. –

9

Tất cả các giải pháp ở đây là khá xấu xí và tiết. Chỉ cần đặt đường bên trong đối tượng Mashaller chỉ định tiêu đề bổ sung.

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

Ví dụ này sẽ xuất một đối tượng XML vào tệp bằng cách sử dụng biểu định kiểu và định dạng các yếu tố độc đáo để con người đọc. Các đối tượng myXmlObject là của lớp MyXmlClass, và sẽ được ghi vào file, định dạng bởi một stylesheet do 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

Đây là cách thanh lịch để làm điều đó, nhưng nó sẽ không hoạt động nếu bạn đang làm 'marshal()' thành một 'File' (ví dụ). Nó yêu cầu đầu ra là Writer hoặc Stream. Một khi bạn nhận thức được điều này nó phải là vấn đề đơn giản để bọc 'File' của bạn trong một' FileWriter'. –

+0

@KevinSadler Vui lòng cập nhật câu trả lời của tôi! –

+0

@KevinSadler Chỉnh sửa của bạn đã bị cộng đồng từ chối. Tôi đã thêm bản chỉnh sửa, nhưng nó đã bị xáo trộn. Xin vui lòng, prettify nó như vậy mà chỉnh sửa sẽ được liên kết với bạn! Cảm ơn! –

Các vấn đề liên quan