2017-01-31 57 views
0

對於我的項目,我有一個包含xsl文件的包(xml)。 當我需要一個我剛剛得到與文件:如何在java包中使用xsl引用文檔

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

貫徹/套https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/Transformer.html #setURIResolver(javax.xml.transform.URIResolver)確保相對URI解析爲從包中讀取而不是從文件系統中讀取。 –

回答

0

感謝馬丁,這是解決這個問題的正確提示。

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

resolver是一個實現URIResolver的類,它實現了函數resolve。 (A位快速和骯髒的解決方案...但它的工作原理)

@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; 
}