如何在spring框架中配置java.xml.transform.Transformer?我需要变换器的实例来通过xslt将xml转换为文本。因此,配置的变换器应该具有xslt样式表的知识是至关重要的。我没有在web项目中使用它,而是在独立的java程序中使用它。
答案 0 :(得分:5)
嗯,配置Transformer的Java是这样的:
Source stylesheetSource = new StreamSource(new File("/path/to/my/stylesheet.xslt"));
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(stylesheetSource);
如果你真的想纯粹在Spring XML中这样做,那就等同于:
<bean id="stylesheetSource" class="javax.xml.transform.stream.StreamSource">
<property name="systemId" value="/path/to/my/stylesheet.xslt"/>
</bean>
<bean id="transformerFactory" class="javax.xml.transform.TransformerFactory" factory-method="newInstance"/>
<bean id="transformer" factory-bean="transformerFactory" factory-method="newTransformer">
<constructor-arg ref="stylesheetSource"/>
</bean>
答案 1 :(得分:2)
您需要从适当的Transformer
获取TransformerFactory
的实例。您可以使用内置的xerces变压器工厂或第三方XSLT处理器,例如saxonica。
使用Spring的IoC,您可以像这样配置Xerces XML转换器:
<bean id="transformerFactory" class="org.apache.xerces.jaxp.SAXParserFactoryImpl" />
或像这样的撒克逊XML变换器:
<bean id="transformerFactory" class="net.sf.saxon.TransformerFactoryImpl" />
一旦有了TransformerFactory,就可以使用依赖注入来获取bean内部或使用IoC的新变换器实例。切换到您的课程内部您可能会有一些属性,例如您需要设置的transFact
:
<bean id="myBean" class="myClass">
<property name="transFact" ref="transformerFactory" />
</bean>
然后在你的课堂上:
public class myClass {
// ...
private javax.xml.transformer.TransformerFactory transFact;
public void myMethod(){
StreamSource transformerStream = new StreamSource(getResourceAsStream(pathToXslt));
javax.xml.transformer.Transformer myTrans = transFact.newTransformer(transformerStream);
// now you've got a myTrans
}
// ...
public setTransFact(javax.xml.transformer.TransformerFactory transFact){
this.transFact = transFact;
}
}
或者,您可以使用factory-method
在IoC中获得一个新的变压器,但需要更多努力。
答案 2 :(得分:2)
我发现这样可以从类路径中提供xsl
文件:
<bean id="errorLogTransformer" factory-bean="transformerFactory" factory-method="newTransformer" >
<constructor-arg>
<bean class="org.springframework.xml.transform.ResourceSource">
<constructor-arg>
<value>classpath:errorLog.xsl</value>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
非常难看,但它确实有用!