对于我的项目,我有一个包含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)" />
变换器在文件系统中搜索,但不在类文件中搜索。所以无法找到文件。
变压器是否有可能寻求包中的其他文件,而不是文件系统?
答案 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;
}