我正处于概念验证阶段,要将一些DocbookPDF转换为→应用程序.基本要求是:
- 它必须"从JAR中运行"--在应用程序服务器的文件系统上设置样式表as files不是我想要的.
- 它是基于Spring的not,所以我想要一种更通用的Java解决方案.
- 我们目前使用的是DocBook 1.79.2样式表,但如果更合适的话,可能会使用xslt20 stylesheets样式表.
- 我们目前正在概念验证中使用Saxon-HE 12.3,但绝对可以将其升级到商业版本.
TLDR是:如何封装DocBook XSLT样式表in a JAR(doesn't需要将JAR分解成文件系统上的文件)?
作为docbook-app邮件列表中的recently discussed,我可以从src/main/resources/xsl
(在该级别进行一些定制,然后是src/main/resources/xsl/docbook-xsl-1.79.2
中的DocBook样式表)中的样式表开始,这是一个如下所示的目录:
<?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" />
(并继续将每个.xsl
、.xml
、.ent
和.dtd
文件映射到其classpath:
URI等效项),以及一些如下代码:
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();
这almost个能让我们达到目标,但失败了:
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
如果该线路涉及对document('')
的呼叫:
<xsl:param name="local.l10n.xml" select="document('')"/>
看起来它坚持从一个文件加载自己,然后(显然)在那个URI找不到它.我们如何告诉正在解析对document()
函数的调用的人使用类路径呢?
我已经向gihub提出了minimal example个问题:你可以克隆回购,然后运行mvn clean test
来复制.
我也愿意接受any other approach条建议来完成这项工作,以满足帖子顶部的限制列表!