我使用彈簧集成的xslt-transfomer進行xml轉換。 我的代碼是像下面,如何在xslt-transformer中動態(以編程方式)添加XSL資源?
<int-xml:xslt-transformer id="xmlTransformer" input-channel="inputChannel"
output-channel="outputChannel" xsl-resource="classpath:META-INF/OrderXslt.xsl" />
這裏我想通過XSL-資源=:在運行時 「classpath中META-INF/OrderXslt.xsl」動態。我能夠從上下文獲得xmlTransformer bean,但無法弄清楚如何設置xsl-resource。我的java代碼就像,
File myFile = new File("D:\OrderXslt.xsl");
EventDrivenConsumer transformerConsumer = (EventDrivenConsumer) ctx.getBean("xmlTransformer");
//I need to pass myFile to transformerConsumer instace.
//However I am unable to find any API of EventDrivenConsumer
which will accept xsl resource form here (i.e. myFile)
任何程序化的解釋將不勝感激。 在此先感謝。
編輯
public class TempTransformer<Object, Obejct> extends AbstractTransformer {
private volatile XsltPayloadTransformer xslt;
protected Object doTransform(Message<?> message) throws Exception {
return (Object) findorBuildTransformerForMessage(message).transform(message);
//Its throwing error here as
//org.springframework.integration.transformer.MessageTransformationException: failed to transform message; nested exception is java.lang.NullPointerException
}
private Transformer findorBuildTransformerForMessage(Message<?> message{
xslt = new XsltPayloadTransformer(new ClassPathResource("/META-INF/OrderXslt2.xsl"));
return xslt;
}
編輯
我已經通過以下方式實現XsltPayloadTransformer
的。
protected Message<?> doTransform(Message<?> message) throws Exception {
xsltTransformer = new XsltPayloadTransformer(new ClassPathResource("D:/sample.xsl"));
this.xsltTransformer.setResultType("StringResult");
this.xsltTransformer.afterPropertiesSet();
return this.xsltTransformer.transform(message);
}
但是我沒有得到正確的輸出。另一方面,我有一個簡單的java程序,它使用Saxon實現並顯示正確的輸出。這裏是...
public static void main(String [] arr) {
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource xmlInputFile = new StreamSource("D:/input.xml");
StreamSource xslTransformationFile = new StreamSource("D:/sample.xsl");
StreamResult xmlOutputFile = new StreamResult(new File("D:/output.xml"));
Transformer transformer;
try {
transformer = tFactory.newTransformer(xslTransformationFile); //gives instance of net.sf.saxon.jaxp.TransformerImpl
transformer.transform(xmlInputFile, xmlOutputFile);
}
} catch (Exception e) {
}
}
我不知道我失蹤了。還有什麼我需要設置爲XsltPayloadTransformer
??或者我缺少任何東西? 我正在使用XSL v2和spring 4.1.7和spring integration 4.1.8 vesrions。
@GarryRussell感謝您的解釋,但我仍然很困惑與XsltPayloadTransformer的代表團和我應該怎麼用新的更換。 –
請參閱我的編輯示例,但我認爲我會使用模板方法。 –
@Garry我需要一個線程安全的方法。如何使用 Transformer註釋是線程安全的,我可以使用該實現嗎? (請看最新的編輯) –