我在 Java 资源目录中有一个 example.xsl 文件,可以通过以下方式在 Java 中访问该文件:
class.getClassLoader().getResourceAsStream("example.xsl")
但是example.xsl文件本身有一个引用
<xsl:include href="dir/i18n.inc.xslt"/>
我想将 dir 目录与 i18n.inc.xslt 放在资源目录中,但似乎当我部署代码时,程序正在寻找 dir/i18n.inc.xslt
里面
glassfish/domains/domain1/config
我应该如何在 href 中引用 dir/i18n.inc.xslt 以便它可以查看资源内部?编辑: 我使用java17和payara6。 xslt用于将xml转换为pdf。我正在使用 Apache FOP 来实现此目的。
InputStream styleSheetInput = MyClass.class.getClassLoader().getResourceAsStream("example.xsl");
final FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, outputStream);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(styleSheetInput));
// Set the value of a <param> in the stylesheet
transformer.setParameter("versionParam", "2.0");
// Setup input for XSLT transformation
Source src = new StreamSource(datafile);
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
}
我得到的错误:
[tid: _ThreadID=279 _ThreadName=__ejb-thread-pool11] [timeMillis: 1693598088423] [levelVal
/usr/local/payara6/glassfish/domains/domain1/config/dir/i18n.inc.xslt (No such file or directory)]]
所以它似乎正在将 config 目录作为基本目录进行查找。但我不会将 xslt 文件放在那里,而是将其放在与资源中的 example.xsl 相同的位置。
XSLT file
的上下文有时可能难以理解,因此了解如何根据文件上下文解析这些路径非常重要。
XSLT file
位于资源目录中,因此使用相对路径来引用位于
i18n.inc.xslt
内的
dir subdirectory
文件。所以解决方案是提供一条相对于
XSLT file
位置的路径。 假设您的目录结构如下所示:
src
└── main
└── resources
├── example.xsl
└── dir
└── i18n.inc.xslt
使用相对路径参考it8n.inc.xslt
文件中的
example.xsl
。 这样做:
<xsl:include href="dir/i18n.inc.xslt"/>
当然Deployment Configuration
也可能会被搞乱。如果配置或类路径存在问题,请确保应用程序类路径和资源加载配置设置正确。请注意,在引用
XSLT
文件中的资源或从类路径加载的其他资源时,在资源位置的上下文中使用正确的相对路径至关重要。否则将无法正常工作。