2010-09-13 7 views
11

मैं अपाचे एफओपी का उपयोग कर एक XSL रूपांतरण करने की ज़रूरत लोड हो रहा है और मैं इस तरह कोड था:संबंधित पथ का समाधान किया जब XSLT फ़ाइलों

//Setup FOP 
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); 
//Setup Transformer 
Source xsltSrc = new StreamSource(new File(xslPath)); 
Transformer transformer = tFactory.newTransformer(xsltSrc); 

//Make sure the XSL transformation's result is piped through to FOP 
Result res = new SAXResult(fop.getDefaultHandler()); 
//Setup input 
Source src = new StreamSource(new File(xmlPath)); 
//Start the transformation and rendering process 
transformer.transform(src, res); 

जहां xslPath पथ जहाँ मेरे XSLT फ़ाइल संग्रहीत होती है।

मैंने पुष्टि की है कि यह तब काम करता है जब मेरे पास केवल एक एक्सएसएलटी फ़ाइल है, लेकिन मेरी परियोजना में मैंने कई एक्सएसएलटी फाइलों में चीजें बांटी हैं और उन्हें <xsl:import /> टैग के साथ शामिल किया है। इस कॉन्फ़िगरेशन के साथ, मुझे NullPointerException मिलता है क्योंकि यह XSLT में संग्रहीत सभी जानकारी को समझ में नहीं आता है क्योंकि यह विभिन्न फ़ाइलों पर वितरित किया जाता है।

मुझे आश्चर्य है कि Source xsltSrc परिवर्तनीय में इन सभी फ़ाइलों को लोड करने का कोई तरीका है, इसलिए सभी एक्सएसएल जानकारी उपलब्ध है।

अद्यतन

मैं मैड्स हैनसेन द्वारा दिए गए उत्तर के आधार पर कोड बदल दिया है, लेकिन यह अभी भी काम नहीं करता। मुझे क्लासपाथ में एक्सएसएलटी स्लॉट फाइलों को शामिल करना होगा, इसलिए मैं क्लासलोडर के साथ एक्सएसएलटी फ़ाइल लोड करता हूं। मैंने जांच की है कि url.toExternalForm() निष्पादित करते समय URL का सही पथ है।

ClassLoader cl = this.getClass().getClassLoader(); 
String systemID = "resources/xslt/myfile.xslt"; 
InputStream in = cl.getResourceAsStream(systemID); 
URL url = cl.getResource(systemID); 
Source source = new StreamSource(in); 
source.setSystemId(url.toExternalForm()); 
transformer = tFactory.newTransformer(source); 

यह पाता है और भार myfile.xslt लेकिन यह अभी भी अन्य XSLT फ़ाइलों के लिए संबंधित पथ का समाधान नहीं होता: इस कोड के अपने नए टुकड़ा है।

मैं क्या गलत कर रहा हूं?

उत्तर

10

जब आप के रूप में एक StreamSource एक XSLT लोड और एक systemid निर्धारित नहीं करते हैं, प्रोसेसर पता नहीं है "कहाँ" XSLT और संबंधित पथ को हल नहीं कर सकते।

http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5

StreamSource करने के लिए एक पैरामीटर के रूप में एक प्रणाली पहचानकर्ता प्रदान करके, आप XSLT प्रोसेसर commonFooter.xslt के लिए जहां के लिए नज़र कह रहे हैं। इस पैरामीटर के के बिना, आपको त्रुटि हो सकती है जब प्रोसेसर इस यूआरआई को हल नहीं कर सकता है। के रूप में इस प्रकार है उन्हें आसानी से ठीक कॉल setSystemId() विधि के लिए है:

// construct a Source that reads from an InputStream 
Source mySrc = new StreamSource(anInputStream); 
// specify a system ID (a String) so the 
// Source can resolve relative URLs 
// that are encountered in XSLT stylesheets 
mySrc.setSystemId(aSystemId); 
+0

आपके उत्तर के लिए धन्यवाद, लेकिन यह मेरी समस्या का समाधान नहीं करता है, हालांकि आपका उत्तर समझ में आता है। मैंने कोड में अपने परिवर्तनों के साथ अपना प्रश्न अपडेट कर लिया है। – Javi

+0

आपको अपने सिस्टम आईडी के लिए एक पूर्ण पथ प्राप्त करने की आवश्यकता हो सकती है। जब तक आप नहीं जानते कि यह "से" के सापेक्ष पथ को हल करेगा। उस सापेक्ष पथ को किसी पूर्ण पथ में परिवर्तित करने का प्रयास करें जैसे कि: 'स्ट्रिंग xsltSystemId = नई फ़ाइल (systemID) .toURL()। ToExternalForm(); 'या' स्ट्रिंग xsltSystemId = नई फ़ाइल (सापेक्षपाथ) .getAbsolutePath(); ' –

+0

धन्यवाद , मैं पहले से ही उसमें था और मैंने जांच की थी कि जब मैं url.toExternalForm() यह एक पूर्ण पथ मिलता है। लेकिन मुझे नहीं पता कि अब समस्या कहां है। – Javi

17

मैं सिर्फ यह मिल गया, एक देर जवाब (एफओपी 1.0 पर परीक्षण) ------

सभी आप की जरूरत है मेरे लिए काम करता है निम्नलिखित के रूप में, अपने कारखाने के लिए एक uri समाधानकर्ता स्थापित करने के लिए है:

TransformerFactory transFact = TransformerFactory.newInstance(); 
StreamSource xsltSource = new StreamSource(xsl); 

// XXX for 'xsl:import' to load other xsls from class path 
transFact.setURIResolver(new ClasspathResourceURIResolver()); 
Templates cachedXSLT = transFact.newTemplates(xsltSource); 
Transformer transformer = cachedXSLT.newTransformer(); 


class ClasspathResourceURIResolver implements URIResolver { 
    @Override 
    public Source resolve(String href, String base) throws TransformerException { 
    return new StreamSource(XXX.getClassLoader().getResourceAsStream(href)); 
    } 
} 

और मेरी आयात करने XSL (ताकि 'imported.xsl' classpath में होना चाहिए):

<xsl:import href="META-INF/companybusinesscredit/imported.xsl"/> 
+0

आपको बहुत धन्यवाद, यह मुझे घंटे बचाता है। –

2

मैं सैक्सन 9 एक्स का उपयोग कर रहा हूं और स्टाइलशीट के भीतर दस्तावेज़ का उपयोग करते समय भी समस्याएं थीं। स्टाइलशीट को सही ढंग से हल किया गया था लेकिन जार फ़ाइल में स्टाइलशीट के साथ बंडल किए गए एक्सएमएल को सेट सिस्टम सिस्टम के साथ भी लोड नहीं किया गया था। इसके परिणामस्वरूप फाइल अपवाद नहीं मिली।मेरे लिए नीचे दिए गए कोड के साथ रिज़ॉल्यूवर को कस्टम कोड करना आसान था:

JarfileResolver jarfileResolver = new JarfileResolver(); 
transformer.setURIResolver(jarfileResolver); 


public class JarfileResolver implements URIResolver 
{ 
    public Source resolve(String fileName, String base) throws TransformerException 
    { 
     URL url = getClass().getClassLoader().getResource(fileName); 
     StreamSource jarFileSS = new StreamSource(); 

     try 
     { 
      InputStream jarfileIS = url.openStream(); 
      jarFileSS.setInputStream(jarfileIS); 
     } 
     catch(IOException ioExp) 
     { 
      throw new TransformerException(ioExp); 
     } 
     return jarFileSS; 
    } 
} 
संबंधित मुद्दे