如何在java包中引用带有xsl的文档

时间:2017-01-31 09:34:15

标签: java xml xslt

对于我的项目,我有一个包含xsl文件的包自带包(xml)。 当我需要一个时,我只需获取文件:

String xsl=getTextResource(this,"../xml/rob.xsl");

并且转换按预期工作

TransformerFactory tFactory=getTransformerFactory();

        Transformer transformer=tFactory.newTransformer(xslSource);

        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");

        if(xslParameters !=null) {
            for(Parameter p:xslParameters) {
                transformer.setParameter(p.getName(), p.getStringValue());
            }
        }

        result=XMLHelper.createDocument();
        DOMResult resultStream=new DOMResult(result);

        transformer.transform(xmlSource, resultStream);

然而我的问题出现在声明中:

  <xsl:param name="matcherPath">.</xsl:param>
  <xsl:param name="parameterPath"  select="concat($matcherPath,'/','rob_parameters.xml')" />
  <xsl:variable name="zuordnungsTabelle" select="document(concat($matcherPath,'/','rob_matcher.xml'))" />
  <xsl:variable name="parameterTabelle"  select="document($parameterPath)" />  

变换器在文件系统中搜索,但不在类文件中搜索。所以无法找到文件。

变压器是否有可能寻求包中的其他文件,而不是文件系统?

1 个答案:

答案 0 :(得分:0)

感谢马丁,这是解决这个问题的正确提示。

...
 TransformerFactory tFactory=getTransformerFactory();
...
tFactory.setURIResolver(resolver);

resolver是一个实现URIResolver的类,它实现了函数resolve。 (有点快速和肮脏的解决方案......但它确实有效)

@Override
public Source resolve(String href, String base) throws TransformerException {
    Source result=null;
    // System.out.println("href="+href+" base="+base);
    try {
        String resultString=getTextResource(this,"../xml/"+href);
        result=new StreamSource(new StringReader(resultString));
    } catch (FileNotFoundException ex) {
        Logger.getLogger(RoB_TransferGenerator.class.getName()).log(Level.SEVERE, null, ex);
        throw new TransformerException("href="+href+" base="+base+ " not found");
    }

    return result;
}