2010-01-28 13 views
7

मैं जेएक्सबी का उपयोग कर गतिशील रूप से एक्सएमएल उत्पन्न कर रहा हूं।जेएक्सबी बनाना एक एक्सएमएल प्रोसेसिंग निर्देश उत्पन्न करता है

अब, मैं इसे एक्सएसएल का उपयोग करके HTML में परिवर्तित करना चाहता हूं। मैं

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

गतिशील रूप से जेनरेट किए गए XML में कैसे शामिल कर सकता हूं?

+0

तुम्हारा मतलब आप JAXB उत्पादन में स्टाइलशीट संदर्भ शामिल करना चाहते हैं: वस्तु myXmlObject एक स्टाइलशीट xslUrl द्वारा दिए गए द्वारा फ़ॉर्मेट वर्ग MyXmlClass की है, और file को लिखा जाएगा? – skaffman

उत्तर

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-आरएस रूपरेखा का हिस्सा: 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

कृपया शब्दों में और न केवल कोड में जवाब देने का प्रयास करें। और चूंकि आप बहुत देर से जवाब देते हैं, तो आपका उत्तर दूसरे से अलग कैसे होता है? –

+0

यह एक कामकाज प्रतीत होता है। –

9

सभी यहाँ समाधान बहुत बदसूरत और अत्यधिक शब्द हैं। अतिरिक्त शीर्षलेख निर्दिष्ट करने वाले Mashaller ऑब्जेक्ट के अंदर बस लाइन सेट करें।

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

यह उदाहरण उत्पादन एक फाइल करने के लिए एक XML वस्तु मनुष्य के लिए अच्छी तरह से एक स्टाइलशीट का उपयोग कर और तत्वों को फ़ॉर्मेट को पढ़ने के लिए होगा।

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

यह करने का यह शानदार तरीका है, लेकिन यदि आप 'फ़ाइल' (उदाहरण के लिए) में 'marshal() 'कर रहे हैं तो यह काम नहीं करेगा। इसके लिए आउटपुट को लेखक या स्ट्रीम होना आवश्यक है। एक बार जब आप इसके बारे में जानते हों तो अपने 'फ़ाइल' को' फ़ाइलवाइटर 'में लपेटना आसान बात होनी चाहिए। –

+0

@ केविनस्डलर कृपया, मेरे उत्तर को अपडेट करने के लिए स्वतंत्र महसूस करें! –

+0

@ केविनस्डलर आपका संपादन समुदाय द्वारा अस्वीकार कर दिया गया है। मैंने संपादन जोड़ा, लेकिन यह बदसूरत है। कृपया, इसे प्रसन्न करें कि संपादन आपके साथ जुड़ा होगा! धन्यवाद! –

संबंधित मुद्दे