英文:
Adding a catalog to XSLT Saxon s9api in Java
问题
以下是翻译好的部分:
我有以下代码,它以XML作为输入,并生成一堆其他文件作为输出。
public void transformXml(InputStream inputFileStream, Path outputDir) {
try {
Resource resource = resourceLoader
.getResource("classpath:demo.xslt");
LOGGER.info("Creating output XMLs and Assessment Report in {}", outputDir);
final File outputFile = new File(outputDir.toString());
final Processor processor = getSaxonProcessor();
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable stylesheet = compiler.compile(new StreamSource(resource.getFile()));
Xslt30Transformer transformer = stylesheet.load30();
Serializer out = processor.newSerializer(outputFile);
out.setOutputProperty(Serializer.Property.METHOD, "xml");
transformer.transform(new StreamSource(inputFileStream), out);
LOGGER.debug("Generated DTD XMLs and Assessment Report successfully in {}", outputDir);
} catch (SaxonApiException e) {
throw new XmlTransformationException("Error occurred during transformation", e);
} catch (IOException e) {
throw new XmlTransformationException("Error occurred during loading XSLT file", e);
}
}
private Processor getSaxonProcessor() {
final Configuration configuration = Configuration.newConfiguration();
configuration.disableLicensing();
Processor processor = new Processor(configuration);
return processor;
}
XML输入包含一个DOCTYPE标签,该标签解析为我无法访问的DTD。因此,我希望使用目录将其指向我类路径上的虚拟DTD。
我正在努力找到一种方法来实现这一点。我在外面找到的大多数示例都没有使用s9api实现。有什么想法吗?
英文:
I have the following code which takes XML as input and produces a bunch of other files as output.
public void transformXml(InputStream inputFileStream, Path outputDir) {
try {
Resource resource = resourceLoader
.getResource("classpath:demo.xslt");
LOGGER.info("Creating output XMLs and Assessment Report in {}", outputDir);
final File outputFile = new File(outputDir.toString());
final Processor processor = getSaxonProcessor();
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable stylesheet = compiler.compile(new StreamSource(resource.getFile()));
Xslt30Transformer transformer = stylesheet.load30();
Serializer out = processor.newSerializer(outputFile);
out.setOutputProperty(Serializer.Property.METHOD, "xml");
transformer.transform(new StreamSource(inputFileStream), out);
LOGGER.debug("Generated DTD XMLs and Assessment Report successfully in {}", outputDir);
} catch (SaxonApiException e) {
throw new XmlTransformationException("Error occured during transformation", e);
} catch (IOException e) {
throw new XmlTransformationException("Error occured during loading XSLT file", e);
}
}
private Processor getSaxonProcessor() {
final Configuration configuration = Configuration.newConfiguration();
configuration.disableLicensing();
Processor processor = new Processor(configuration);
return processor;
}
The XML input contains a DOCTYPE tag which resolves to a DTD that is not available to me. Hence why I am wanting to use a catalog to point it to a dummy DTD which is on my classpath.
I am struggling to find a way to this. Most examples that I find out there, are not using the s9api implementation. Any ideas?
答案1
得分: 1
代替使用:
new StreamSource(inputFileStream)
您应该实例化一个SAXSource
,其中包含一个已初始化为使用目录解析器作为其EntityResolver
的XMLReader
。
如果您需要对其他源文档执行相同的操作,例如使用doc()
或document()
读取的文档,您应该提供一个URIResolver
,该解析器本身返回以相同方式初始化的SAXSource
。
还有其他使用Saxon配置属性的方法,但我认为上述方法是最简单的。
英文:
Instead of
new StreamSource(inputFileStream)
you should instantiate a SAXSource
, containing an XMLReader
initialized to use the catalog resolver as its EntityResolver
.
If you need to do the same thing for other source documents, such as those read using doc()
or document()
, you should supply a URIResolver
which itself returns a SAXSource
initialized in the same way.
There are other ways of doing it using Saxon configuration properties, but I think the above is the simplest.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论