2016-11-07 2 views
0

У меня есть требование загрузить таблицу стилей в кеш. С помощью следующего кода для компиляции XSLT, я получаю исключение:Ошибка компиляции XSLT из Java

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

Добро пожаловать в переполнение стека! Ваше изображение текста [не очень полезно] (// meta.unix.stackexchange.com/q/4086). Он не может быть прочитан вслух или скопирован в редактор, и он не индексируется очень хорошо, что означает, что другие пользователи с одинаковой проблемой с меньшей вероятностью найдут ответ здесь. Пожалуйста, отредактируйте свое сообщение, чтобы включить соответствующий текст напрямую (желательно с помощью copy + paste, чтобы избежать ошибок транскрипции). –

+0

Измените ClassLoader.getSystemResourceAsStream (имя файла) на 'XSLT.class.getResourceAsStream (filename)'. – VGR

+0

Измените 'System.out.println (e.toString());' на 'e.printStackTrace()' и обеспечите полную трассировку стека. – kgeorgiy

ответ

1

Первая проблема заключается в том, что ваш код не выводит ошибки, о которых сообщается в XSLT компилятором. Это затрудняет определение ошибок. Вы только выводите сообщение об исключении, в котором говорится, что были сообщены ошибки, и это не очень полезно.

Saxon по умолчанию отправляет сообщения об ошибках на стандартный вывод ошибки, который, вероятно, отправляется в какой-либо файл журнала где-то - все зависит от среды, в которой вы работаете. Вы можете отправлять сообщения в другом месте, например написав свой собственный ErrorListener и позвонив xFormFactory.setErrorListener(); или вы можете изменить назначение вывода для стандартного прослушивателя ошибок Saxon, установив свойство конфигурации фабрики http://saxon.sf.net/feature/standardErrorOutputFile на имя файла, в котором вы хотите, чтобы сообщения были написаны.

Сказав это, я сильно подозреваю, что сообщения просто скажут вам, что вы не правильно подбираете файл таблицы стилей. Но это определенно стоит исправлять приложение, чтобы при появлении ошибок в вашей таблице стилей в будущем вы могли видеть сообщения.

Смежные вопросы