2010-06-03 6 views
20

में सैक्सन TransformerFactory चयन करने के लिए अपने वेब आवेदन में मैं आदेश XSLT 2.0 का उपयोग करने के सेक्सन TransformerFactory उपयोग करने की आवश्यकता है, लेकिन मैं setProperty विधि का उपयोग नहीं कर सकते हैं क्योंकि मैं वेब सर्वर पर इस अधिकार नहीं है और वहाँ है एक सुरक्षा प्रबंधक।कैसे जावा

तो मैंने पढ़ा है कि यह यह करने के लिए संभव हो जाना चाहिए:

classname निर्धारित करने के लिए, सेवा API (जार विनिर्देश में विस्तृत रूप में) का उपयोग करें यदि उपलब्ध है। सेवा एपीआई मेटा-आईएनएफ/सेवाओं/javax.xml.transform फ़ाइल में एक वर्गनाम की तलाश करेगा। रनटाइम पर उपलब्ध जार में ट्रांसफॉर्मर फैक्टरी।

मैं वेब-INF/lib/saxon9.jar में इस फ़ाइल मिली थी लेकिन जब मैं एक TransformerFactory istantiate, डिफ़ॉल्ट कारखाने हमेशा एक सेक्सन कारखाने के बजाय चुना गया है।

मैं सैक्सन ट्रांसफार्मर फैक्टरी का चयन कैसे कर सकते हैं?

धन्यवाद

+0

नीचे दिए गए सभी दृष्टिकोणों का सारांश (और अधिक) यहां पाया जा सकता है: http://stackoverflow.com/questions/11314604/how-to-set-saxon-as-the-xslt-processor-in-java –

उत्तर

11

आप की तरह

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); 

अपने कोड में प्रणाली संपत्ति की स्थापना करके की कोशिश कर सकते हैं TransformerFactory का एक उदाहरण से पहले यह करते हैं।

नोट: इस सेक्सन उपयोग करने के लिए अपने बिलाव पर सभी webapps के लिए बाध्य करेगा - तो आप यकीन है कि किसी भी अन्य webapps जो डिफ़ॉल्ट उपयोग कर रहे थे ठीक हैं बनाने के लिए की है।

5

आपके आवेदन वास्तव में सेक्सन की आवश्यकता है और एक अन्य प्रोसेसर के साथ काम नहीं करेंगे तो यह शायद सैक्सन TransformerFactory सीधे new net.sf.saxon.TransformerFactoryImpl()

22

उचित तरीके से उपयोग करते हुए कारखाने वर्ग निर्दिष्ट करके इस है क्या करने के लिए जब हो रही का दृष्टांत को ठीक होगा तो एक नया ट्रांसफार्मर फैक्टरी।

मुझे नहीं लगता कि एक विशिष्ट फैक्ट्री कार्यान्वयन को कॉल करना काम करेगा - मेरा मानना ​​है कि डिफ़ॉल्ट सिस्टम ट्रांसफॉर्मर अभी भी वापस आ सकता है (कम से कम यह तब हुआ जब क्लासपाथ में xalan और saxon था)।

उदाहरण:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null); 

या सेक्सन के लिए

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null); 

Javadocs:

से कारखाने वर्ग नाम एक TransformerFactory का एक नया उदाहरण प्राप्त करें। यह फ़ंक्शन उपयोगी है जब क्लासपाथ में कई प्रदाता हैं। यह पर अधिक नियंत्रण देता है क्योंकि यह निर्दिष्ट कर सकता है जो प्रदाता लोड किया जाना चाहिए। एक बार जब एक आवेदन एक TransformerFactory यह कॉन्फ़िगर करने के लिए और ट्रांसफार्मर उदाहरणों प्राप्त कारखाने का उपयोग कर सकते करने के लिए एक संदर्भ प्राप्त किया है।

+1

यह जावा v6 (http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html बनाम http://docs.oracle.com/javase/1.5.0 के रूप में काम करता है /docs/api/javax/xml/transform/TransformerFactory.html) –

+1

यह ओरेकल फ़्यूज़न मिडलवेयर 11.1.1.5.0 रिलीज़ के साथ काम नहीं करता है क्योंकि यह इसके क्लाइंट जार फ़ाइलों के भीतर पुराने कार्यान्वयन का उपयोग करता है। – sweetfa

8

सामग्री के साथ META-INF/services/javax.xml.transform.TransformerFactory फ़ाइल बनाएं: net.sf.saxon.TransformerFactoryImpl। बस।

+0

यह मेरे लिए काम नहीं किया। मैंने अपने वेबएप की मुख्य मेटा-आईएनएफ निर्देशिका का उपयोग किया। क्या मुझे एक अलग उपयोग करने की ज़रूरत है? – Carsten

+0

मैंने इसे समझ लिया। इसे वेब-आईएनएफ/कक्षाओं/मेटा-आईएनएफ/में समाप्त होना है ... – Carsten