如何使用maven将新节点附加到现有XML文档?

时间:2015-02-01 15:43:00

标签: xml maven xslt

我想使用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资源的另一种方法吗?

1 个答案:

答案 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的元素。