2008-11-03 30 views
5

Tôi có dự án Java maven bao gồm các phép biến đổi XSLT. Tôi tải biểu định kiểu như sau:Chuyển đổi Không do xsl: include

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

Biểu định kiểu.xsl có một số câu lệnh. Những dường như đang gây ra vấn đề, khi tôi cố gắng chạy thử nghiệm đơn vị của tôi tôi nhận được các lỗi sau đây:

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 

Các bao gồm báo cáo trong XSLT là các liên kết tương đối

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

Tôi đã cố gắng thử nghiệm và thay đổi những điều sau đây - nhưng tôi vẫn gặp lỗi.

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

Bất kỳ ý tưởng nào? Bất kỳ giúp đỡ nhiều đánh giá cao.

Trả lời

11

Giải quyết sự cố của tôi bằng 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 (... 

và gán này với TransformerFactory

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

Đừng quên đặt 'documentBuilderFactory.setNamespaceAware (true)'. Không làm như vậy có thể ngăn chặn biểu định kiểu cha mẹ tải bất kỳ mẫu nào trong biểu định kiểu con của bạn, dẫn đến lỗi ElemTemplateElement. –

+0

Hãy cẩn thận, setURIResolver cũng có thể được đặt trên máy biến áp (tức là thay vì nhà máy), nhưng nó không có tác dụng sau đó. – robert

0

Tôi gặp sự cố tương tự với vấn đề này một lần với đường dẫn tương đối trong XSLT.

Nếu bạn có thể, hãy thử đặt đường dẫn tuyệt đối trong XSLT - điều đó sẽ giải quyết được lỗi.

Đường dẫn tuyệt đối có lẽ không phù hợp với phiên bản cuối cùng của XSLT, nhưng nó sẽ giúp bạn vượt qua vấn đề maven. Có lẽ bạn có thể có hai phiên bản của XSLT, một phiên bản có đường dẫn tuyệt đối cho maven và một với các đường dẫn tương đối cho bất kỳ công cụ nào khác mà nó đang được sử dụng.

+1

Matt, Cảm ơn bạn đã trả lời - điều này khắc phục được sự cố. Tuy nhiên, các bảng định kiểu được bao gồm trong tệp jar và vì vậy giải pháp này sẽ không hoạt động khi toàn bộ nội dung được đóng gói. – will

1

Đặt đối tượng DocumentBuilder của bạn bằng EntityResolver.

Bạn sẽ phải mở rộng lớp EntityResolver để giải quyết các thực thể bên ngoài của bạn (footer.xsl và topbar.xsl).

7

URIResolver cũng có thể được sử dụng một cách đơn giản hơn như sau:

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; 
     } 
    } 
} 

Sử dụng URIResolver với TransformerFactory như hình dưới đây:

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

Hoặc với biểu thức lambda:

transFact.setURIResolver((href, base) -> { 
    final InputStream s = cls.getResourceAsStream("xslts/" + href); 
    return new StreamSource(s); 
}); 
Các vấn đề liên quan