You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:47:46