我想使用Maven自动添加Spring声明,即将bean节点附加到现有的XML文档。
我尝试使用带有xmltask的AntRun插件但没有成功:beans.xml是重复的,没有插入bean节点元素。
我现在正在使用带有XSL转换的maven XML插件,但仍无法通过此解决方案实现我的目标:beans.xml被复制而没有插入bean节点元素。
由于缺乏对XML操作的了解,我一直在这里阅读,但我无法弄清楚我错过了什么。
我使用以下POM声明来配置Maven XML插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>transform</goal>
</goals>
</execution>
</executions>
<configuration>
<transformationSets>
<transformationSet>
<dir>${basedir}/src/main/resources/spring</dir>
<excludes>
<exclude>spring-context.xml</exclude>
</excludes>
<stylesheet>${basedir}/templates/xslt/spring-stylesheet.xslt</stylesheet>
</transformationSet>
</transformationSets>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon</artifactId>
<version>8.7</version>
</dependency>
</dependencies>
</plugin>
以下样式表配置XML转换
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.springframework.org/schema/beans"
version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="beans">
<xsl:copy>
<xsl:apply-templates select="@* | *"/>
<xsl:element name="bean"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我收到以下文件(这是我的源文档的精确副本)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location" value="classpath:properties/db.properties"/>
</bean>
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
id="dataSource">
<property name="url" value="${jdbc.url}"/>
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
id="sessionFactory">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingLocations">
<value>classpath:hibernate/queries.hbm.xml</value>
</property>
</bean>
<bean class="org.springframework.orm.hibernate4.HibernateTransactionManager"
id="txManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
id="persistenceExceptionTranslationPostProcessor"/>
</beans>
有人可能会指出这里有什么问题,或建议使用Maven附加到XML资源的另一种方法吗?
答案 0 :(得分:1)
使用
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.springframework.org/schema/beans"
xpath-default-namespace="http://www.springframework.org/schema/beans"
version="2.0">
假设您有一个像Saxon 9这样的XSLT 2.0处理器。使用像Xalan这样的XSLT 1.0处理器
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.springframework.org/schema/beans"
xmlns:sb="http://www.springframework.org/schema/beans"
version="1.0">
<xsl:template match="sb:beans">
<xsl:copy>
<xsl:apply-templates select="@* | *"/>
<bean/>
</xsl:copy>
</xsl:template>
使用当前代码,match="beans"
仅匹配没有名称空间的本地名称为beans
的元素。