2016-11-07 75 views
0

我有要求將樣式表加載到緩存中。用下面的代碼編譯XSLT,我得到一個異常:來自Java的XSLT編譯錯誤

javax.xml.transform.TransformerConfigurationException:無法編譯樣式表。檢測到1個錯誤。

雖然附加了XSLT,但XSLT沒有錯誤。下面是XSLT

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
     <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes"/> 
     <xsl:template match="/"> 
      <xsl:copy-of select='.'/> 
     </xsl:template> 
    </xsl:stylesheet> 

我有一個疑問,是否在聲明InputStream stream=ClassLoader.getSystemResourceAsStream(filename);加載文件或沒有。

請幫我理解爲什麼編譯失敗;我沒有太多的經驗,在Java中

package file; 

    import java.io.InputStream; 
    import java.util.HashMap; 
    import java.util.Map; 
    import javax.xml.transform.Source; 
    import javax.xml.transform.Templates; 
    import javax.xml.transform.TransformerConfigurationException; 
    import javax.xml.transform.TransformerException; 
    import javax.xml.transform.TransformerFactory; 
    import javax.xml.transform.URIResolver; 
    import javax.xml.transform.stream.StreamSource; 

    public class XSLT { 

     private static Map<String, Templates> templatesMap = new HashMap<String, Templates>(); 

     public XSLT(){ 

     } 
     public static void main(String[] args) throws Exception{ 
      XSLT xs=new XSLT(); 
      System.out.println(xs.readXSLT("/RemoveNamespaces.xslt")); 
     } 
     public String readXSLT(String filename) throws Exception{ 
      System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl"); 
      //String result=""; 
      InputStream stream=XSLT.class.getResourceAsStream(filename); 
      TransformerFactory xformFactory=TransformerFactory.newInstance(); 
      xformFactory.setURIResolver(new SimpleURIResolver()); 

      Source source=new StreamSource(stream); 
      try{ 
       Templates templates=xformFactory.newTemplates(source); 
      } 
      catch(TransformerConfigurationException e){ 
       e.printStackTrace(); 
      } 
      templatesMap.put(filename, xformFactory.newTemplates(source)); 
      //return templatesMap.get(filename).toString(); 
      return "Dummy"; 
     } 
    } 

    class SimpleURIResolver implements URIResolver { 
     public Source resolve(String href, String base) throws TransformerException { 
      InputStream stream = ClassLoader.getSystemResourceAsStream(href); 
      return new StreamSource(stream); 
     } 

    } 
+3

歡迎來到Stack Overflow!你的文字圖像[不是很有用](// meta.unix.stackexchange.com/q/4086)。它不能被朗讀或複製到編輯器中,而且它的索引也不是很好,這意味着具有相同問題的其他用戶不太可能在此找到答案。請[編輯]您的文章直接合並相關文本(最好使用複製+粘貼以避免轉錄錯誤)。 –

+0

將ClassLoader.getSystemResourceAsStream(filename)更改爲'XSLT.class.getResourceAsStream(filename)'。 – VGR

+0

將'System.out.println(e.toString());'改爲'e.printStackTrace()'並提供完整的堆棧跟蹤。 – kgeorgiy

回答

1

的第一個問題是,你的代碼不輸出了由XSLT編譯器報告的錯誤。這使得識別錯誤是很困難的。您只會輸出異常消息,指出錯誤已被報告,並且這不是很有幫助。

Saxon默認將錯誤消息發送到標準錯誤輸出,該輸出可能發送到某個日誌文件 - 這完全取決於您正在運行的環境。您可以將消息發送到其他地方,例如通過編寫自己的ErrorListener並調用xFormFactory.setErrorListener();,或者您可以通過將工廠的配置屬性http://saxon.sf.net/feature/standardErrorOutputFile設置爲希望寫入消息的文件的名稱來更改Saxon的標準錯誤偵聽器的輸出目標。

話雖如此,我強烈懷疑這些消息只會告訴你,你沒有正確拾取樣式表文件。但絕對值得修復該應用程序,以便將來在樣式表中出錯時,您可以看到這些消息。