Ошибка при загрузке файлов XSL и DTD в преобразовании XSLT

Я пытаюсь создать HTML-файлы, используя XSLT, я использовал xml-файл и xsl-файлы для создания HTML-файла. Здесь некоторые другие файлы xsl, расположенные в том же месте, включены в файл xsl с помощью <xsl:include href="temp.xsl"/>,

Здесь Xsl-файлы расположены по пути "D:/XSL_Folder/". Я использую файл Main.java, который находится в папке D:/Workspace/Webapp_Project/ path.

Когда я пытаюсь создать HTML-файлы, используя в качестве аргументов файлы "D:/XSL_Folder/root.xsl" и "D:/XML_Folder/data.xml" в Main.java, я получаю следующую ошибку при создании шаблонов.

Templates lTemplates = TransformerFactory.newInstance().newTemplates(new StreamSource(new FileInputStream(lFileXSL)));

ОШИБКА: 'D:\Workspace\Webapp_Project\temp.xsl (система не может найти указанный файл)'
ФАТАЛЬНАЯ ОШИБКА: "Не удалось скомпилировать таблицу стилей"
12:20:07 ОШИБКА fstvv2.dao.impl.DocUnitDaoImpl - Ошибка при создании нового XslTransformerGetter. Путь к XSL может быть неправильным. javax.xml.transform.TransformerConfigurationException: Не удалось скомпилировать таблицу стилей на com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:885) ~[na:1.7.0_13]

В отчете об ошибках мы видим, что анализатор проверяет включенный файл xsl в пути проекта (D:\Workspace\Webapp_Project), а не в пути, где находится файл root.xsl (D:/XSL_Folder/).

Может кто-нибудь предложить мне, почему парсер ищет xsl-файл в папке проекта по пути, где расположен файл root.xsl и как решить эту проблему?

Код, который я использую для создания HTML-файла с использованием XSL и XML-файла:

public static void simpleTransform(InputStream lXmlFileStream, File lXSLFile,  
    StreamResult lHtmlResult, Map<String, String> lArguments) {  
        TransformerFactory tFactory = TransformerFactory.newInstance();  
        try {  
            Transformer transformer =  
            tFactory.newTransformer(new StreamSource(lXSLFile));    
            for (Entry<String, String> lEntrie : lArguments.entrySet()) {
                transformer.setParameter(lEntrie.getKey(), lEntrie.getValue());
            }
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.transform(new StreamSource(lXmlFileStream), lHtmlResult);
        } 
        catch (Exception e) {  
          e.printStackTrace();  
        }  
}

2 ответа

Решение

Вы пометили вопрос "саксон" и сказали, что используете XSLT 2.0, но сообщения об ошибках показывают, что вы используете Xalan. Если вы конкретно хотите использовать Saxon, то лучше всего избегать использования поиска по пути классов JAXP и создавать экземпляры Saxon напрямую - вместо TransformerFactory.newInstance() используйте новую net.sf.saxon.TransformerFactory().

Предоставление файла в качестве аргумента StreamSource должно быть в порядке; но я хотел бы посмотреть, как создается объект File lXSLFile. Я подозреваю, что вы сделали что-то вроде нового файла ("root.xsl"), и он был разрешен относительно текущего каталога.

Вы можете попробовать использовать <xsl:include href="resolve-uri('temp.xsl')"/> вместо <xsl:include href="temp.xsl"/> чтобы избежать этой проблемы.

Другие вопросы по тегам