Ошибка при загрузке файлов 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/.

Когда я пытаюсь создать 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();  
        }  
}

person Purushotham    schedule 23.05.2013    source источник
comment
Еще одно замечание: ваше сообщение об ошибке ищет файл temp.xsl вместо файла root.xsl. Есть ли какой-либо другой параметр или жестко закодированная информация?   -  person Navin Rawat    schedule 23.05.2013
comment
Файл @Navin Rawat temp.xsl включается в файл root.xsl с помощью ‹xsl:include href=temp.xsl/›. И файл root.xsl, и файлы temp.xsl расположены по одному и тому же пути (D:/XSL_Folder/). Я передаю root.xsl в xslt для перевода, но синтаксический анализатор ищет файл temp.xsl по другому пути (например, ОШИБКА: «D:\Workspace\Webapp_Project\temp.xsl (система не может найти указанный файл)»).   -  person Purushotham    schedule 23.05.2013
comment
Убедитесь, что оба файла находятся по одному и тому же пути. Это единственный файл, который вы включили в основной файл XSLT? Какую версию XSLT вы используете?   -  person Navin Rawat    schedule 23.05.2013
comment
Оба находятся по одному и тому же пути, и основной XSLT также включает в себя множество других файлов xsl, если я укажу полный путь xsl в теге include, он не выдаст никакой ошибки, например ‹xsl:include href=D:/XSL_Folder/temp.xsl/›, но невозможно указать полный путь в файле xsl, так как местоположение xsl может измениться в любое время. Версия XSLT — 2.0.   -  person Purushotham    schedule 23.05.2013


Ответы (2)


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

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

person Michael Kay    schedule 23.05.2013

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

person Navin Rawat    schedule 24.05.2013