Ошибка при загрузке файлов 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"/>
чтобы избежать этой проблемы.