非Spring Java Web应用中DocBook XSLT转换的JAR内封装方案问询
如何在JAR内封装DocBook XSLT样式表并让document()函数从类路径解析资源?
核心需求
- 必须从JAR直接运行,禁止将样式表部署到应用服务器文件系统;
- 非Spring框架,需要通用Java解决方案;
- 当前使用DocBook 1.79.2样式表,可切换至XSLT2.0版本;
- 现用Saxon-HE 12.3,可升级至商业版本。
已尝试的方案
将样式表放置在src/main/resources/xsl目录(自定义样式+DocBook 1.79.2样式表在src/main/resources/xsl/docbook-xsl-1.79.2),配置catalog文件映射资源到classpath: URI:
<?xml version="1.0" encoding="utf-8"?> <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <uri name="file:/xsl/juno-driver.xsl" uri="classpath:/xsl/juno-driver.xsl" /> <uri name="file:/xsl/header-footer.xsl" uri="classpath:/xsl/header-footer.xsl" /> <uri name="file:/xsl/table.xsl" uri="classpath:/xsl/table.xsl" /> <uri name="file:/xsl/titlepage.xsl" uri="classpath:/xsl/titlepage.xsl" /> <uri name="file:/xsl/docbook-xsl-1.79.2/fo/docbook.xsl" uri="classpath:/xsl/docbook-xsl-1.79.2/fo/docbook.xsl" /> <uri name="file:/xsl/docbook-xsl-1.79.2/VERSION.xsl" uri="classpath:/xsl/docbook-xsl-1.79.2/VERSION.xsl" /> <uri name="file:/xsl/docbook-xsl-1.79.2/fo/param.xsl" uri="classpath:/xsl/docbook-xsl-1.79.2/fo/param.xsl" /> </catalog>
编写的Java代码:
DOMResult result = new DOMResult(); TransformerFactory factory = TransformerFactory.newInstance(); InputStream is = XmlTest.class.getResourceAsStream("/xsl/juno-driver.xsl"); Source source = new StreamSource(is, "file:/xsl/juno-driver.xsl"); Transformer transformer = factory.newTransformer(source); transformer.transform(new DOMSource(document), result); return (Document) result.getNode();
遇到的错误
执行时出现文件未找到错误:
Error at char 9 in expression in xsl:param/@select on line 18 column 57 of l10n.xsl: FODC0002 I/O error reported by XML parser processing file:///xsl/docbook-xsl-1.79.2/common/l10n.xsl. Caused by java.io.FileNotFoundException: /xsl/docbook-xsl-1.79.2/common/l10n.xsl (No such file or directory) at parameter local.l10n.xml on line 18 column 57 of l10n.xsl: invoked by global parameter local.l10n.xml at file:///xsl/docbook-xsl-1.79.2/common/l10n.xsl#18
错误源于l10n.xsl中调用document('')的代码:
<xsl:param name="local.l10n.xml" select="document('')"/>
核心问题
程序试图从文件系统加载样式表,但对应的URI不存在。如何让document()函数使用类路径(classpath)解析资源?同时欢迎提供符合需求的其他实现方案。
内容的提问来源于stack exchange,提问作者Paul A. Hoadley
相关产品推荐
相关产品推荐

