加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 加载XSLT文件时解析相对路径

发布时间:2020-12-14 17:49:14 所属栏目:Java 来源:网络整理
导读:我需要使用Apache FOP进行XSL转换,我有这样的代码: //Setup FOPFop fop = fopFactory.newFop(MimeConstants.MIME_PDF,out);//Setup TransformerSource xsltSrc = new StreamSource(new File(xslPath));Transformer transformer = tFactory.newTransformer(x
我需要使用Apache FOP进行XSL转换,我有这样的代码:
//Setup FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,out);
//Setup Transformer
Source xsltSrc = new StreamSource(new File(xslPath));
Transformer transformer = tFactory.newTransformer(xsltSrc);

//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
//Setup input
Source src = new StreamSource(new File(xmlPath));
//Start the transformation and rendering process
transformer.transform(src,res);

其中xslPath是存储我的XSLT文件的路径.

我已经确认它有效,当我只有一个XSLT文件,但在我的项目中,我将事情分成几个XSLT文件,并与< xsl:import />标签.通过这种配置,我得到一个NullPointerException,因为它不能理解存储在XSLT中的所有信息,因为它分布在不同的文件上.

我想知道是否有任何方法可以在Source xsltSrc变量中加载所有这些文件,以便所有的XSL信息都可用.

UPDATE

我已经根据Mads Hansen给出的答案改变了代码,但它仍然不起作用.我必须在类路径中包含XSLT slt文件,所以我使用ClassLoader加载XSLT文件.执行url.toExternalForm()时,我已经检查过该URL的路径是否正确.这是我的新代码:

ClassLoader cl = this.getClass().getClassLoader();
String systemID = "resources/xslt/myfile.xslt";
InputStream in = cl.getResourceAsStream(systemID);
URL url = cl.getResource(systemID);
Source source = new StreamSource(in);
source.setSystemId(url.toExternalForm());
transformer = tFactory.newTransformer(source);

它找到并加载myfile.xslt,但仍然无法解析到其他XSLT文件的相对路径.

我究竟做错了什么?

解决方法

我刚刚得到它,一个迟到的答案(测试在FOP 1.0)——

您需要的是为您的工厂设置一个uri解析器,如下所示:

TransformerFactory transFact = TransformerFactory.newInstance();
StreamSource xsltSource = new StreamSource(xsl);

// XXX for 'xsl:import' to load other xsls from class path
transFact.setURIResolver(new ClasspathResourceURIResolver());
Templates cachedXSLT = transFact.newTemplates(xsltSource);
Transformer transformer = cachedXSLT.newTransformer();


class ClasspathResourceURIResolver implements URIResolver {
  @Override
  public Source resolve(String href,String base) throws TransformerException {
    return new StreamSource(XXX.getClassLoader().getResourceAsStream(href));
  }
}

和我导入的xsl(所以’imported.xsl’应该在类路径中):

<xsl:import href="META-INF/companybusinesscredit/imported.xsl"/>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读