2008-11-03 15 views
5

में मेरे पास जावा मेवेन प्रोजेक्ट है जिसमें एक्सएसएलटी रूपांतरण शामिल हैं। मैं स्टाइलशीट को निम्नानुसार लोड करता हूं:एक्सएसएल के कारण विफलता:

TransformerFactory tFactory = TransformerFactory.newInstance(); 

DocumentBuilderFactory dFactory = DocumentBuilderFactory 
       .newInstance(); 

dFactory.setNamespaceAware(true); 

DocumentBuilder dBuilder = dFactory.newDocumentBuilder(); 

ClassLoader cl = this.getClass().getClassLoader(); 
java.io.InputStream in = cl.getResourceAsStream("xsl/stylesheet.xsl"); 

InputSource xslInputSource = new InputSource(in); 
Document xslDoc = dBuilder.parse(xslInputSource); 

DOMSource xslDomSource = new DOMSource(xslDoc); 

Transformer transformer = tFactory.newTransformer(xslDomSource); 

स्टाइलशीट.एक्सएसएल में कई कथन हैं। इन समस्याओं के कारण होना दिखाई देते हैं, जब मैं अपने इकाई परीक्षण चलाने का प्रयास मैं निम्नलिखित त्रुटियाँ मिलती है:

C:\Code\workspace\app\dummy.xsl; Line #0; Column #0; Had IO Exception with stylesheet file: footer.xsl 
C:\Code\workspace\app\dummy.xsl; Line #0; Column #0; Had IO Exception with stylesheet file: topbar.xsl 

XSLT में बयान शामिल संबंधित लिंक्स

xsl:include href="footer.xsl" 
xsl:include href="topbar.xsl" 

मैं प्रयोग और बदलते कोशिश की है कर रहे हैं इन्हें निम्नलिखित में - लेकिन मुझे अभी भी त्रुटि मिलती है।

xsl:include href="xsl/footer.xsl" 
xsl:include href="xsl/topbar.xsl" 

कोई विचार? किसी भी मदद की बहुत सराहना की।

उत्तर

11

URIResolver का उपयोग करके मेरी समस्या हल हो गई।

class MyURIResolver implements URIResolver { 
@Override 
public Source resolve(String href, String base) throws TransformerException { 
    try { 
    ClassLoader cl = this.getClass().getClassLoader(); 
    java.io.InputStream in = cl.getResourceAsStream("xsl/" + href); 
    InputSource xslInputSource = new InputSource(in); 
    Document xslDoc = dBuilder.parse(xslInputSource); 
    DOMSource xslDomSource = new DOMSource(xslDoc); 
    xslDomSource.setSystemId("xsl/" + href); 
    return xslDomSource; 
} catch (... 

और TransformerFactory

tFactory.setURIResolver(new MyURIResolver()); 
+0

'documentBuilderFactory.setNamespaceAware (true)' सेट करना न भूलें। ऐसा करने में विफल होने से माता-पिता स्टाइलशीट को आपके बच्चे स्टाइलशीट में जो भी टेम्प्लेट लोड करना पड़ सकता है, जिसके परिणामस्वरूप ElemTemplateElement त्रुटियां होती हैं। –

+0

सावधान रहें, setURIResolver ट्रांसफॉर्मर पर भी सेट किया जा सकता है (यानी कारखाने के बजाय), लेकिन इसका कोई प्रभाव नहीं पड़ता है। – robert

0

मुझे XSLT में सापेक्ष पथ के साथ एक बार इस तरह की समस्या थी।

यदि आप कर सकते हैं, तो एक्सएसएलटी में पूर्ण पथ डालने का प्रयास करें - जो त्रुटि को हल करना चाहिए।

एक्सएसएलटी के अंतिम संस्करण के लिए शायद एक पूर्ण पथ संभव नहीं है, लेकिन यह आपको मेवेन समस्या से दूर ले जाना चाहिए। शायद आपके पास एक्सएसएलटी के दो संस्करण हो सकते हैं, एक मेवेन के लिए पूर्ण पथ और एक अन्य उपकरण के साथ सापेक्ष पथ के साथ एक जिसका उपयोग किया जा रहा है।

+1

मैट, उत्तर के लिए धन्यवाद - इससे समस्या ठीक हो जाती है। हालांकि, स्टाइलशीट जार फ़ाइल में शामिल हैं और इसलिए पूरी चीज पैक होने के बाद यह समाधान काम नहीं करेगा। – will

1

अपने दस्तावेज़बिल्डर ऑब्जेक्ट को EntityResolver के साथ सेट करें।

आपको अपनी बाहरी संस्थाओं (footer.xsl और topbar.xsl) को हल करने के लिए EntityResolver क्लास का विस्तार करना होगा।

7

URIResolver भी नीचे के रूप में एक और अधिक सरल तरीके से इस्तेमाल किया जा सकता के साथ इस बताए:

class XsltURIResolver implements URIResolver { 

    @Override 
    public Source resolve(String href, String base) throws TransformerException { 
     try{ 
       InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("xslts/" + href); 
       return new StreamSource(inputStream); 
     } 
     catch(Exception ex){ 
      ex.printStackTrace(); 
      return null; 
     } 
    } 
} 

उपयोग TransformerFactory साथ URIResolver नीचे दिखाया गया है:

TransformerFactory transFact = TransformerFactory.newInstance(); 
transFact.setURIResolver(new XsltURIResolver()); 

या लैम्ब्डा अभिव्यक्ति के साथ:

transFact.setURIResolver((href, base) -> { 
    final InputStream s = cls.getResourceAsStream("xslts/" + href); 
    return new StreamSource(s); 
}); 
संबंधित मुद्दे