我正处于将一些 DocBook → PDF 转换构建为 Web 应用程序的概念验证阶段。基本要求是:
TLDR 是:如何将 DocBook XSLT 样式表封装在 JAR 中(不需要需要将 JAR 分解到文件系统上的文件中)?
正如最近在 docbook-apps 邮件列表中讨论的那样,我可以从 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();
这几乎
让我们到达那里,但失败了:
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()
函数的调用的人使用类路径?
我还愿意寻求有关“任何其他方法”的建议来完成此任务,以满足帖子顶部的限制列表!正如我在私人电子邮件中指出的那样,DocBook xslTNG 样式表“开箱即用”地做到了这一点。我正在旅行(意外地),但我会尽力尽快跟进更多详细信息。