0

使用 Maven 或 Ant 想要从 xml 文件中获取值并使用目标/配置文件将其替换为变量。

properties.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<variables>
    <variable id="Title">
      <book.01>abc</book.01>
      <book.02>def</book.01>
      <ebook.03>ghi</book.01>
      <ebook.04>klmn</book.01>
    </variable>
    <variable id="Author">
      <book.01>john</book.01>
      <book.02>jack</book.01>
      <ebook.03>simi</book.01>
      <ebook.04>laura</book.01>
    </variable>
</variables>

如果我选择“book.01”作为目标或配置文件,则使用 Maven 或 Ant,我想将 Template.xml 中的值替换为 properties.xml 中的“book.01”值

当前 Template.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<projects>
    <mbean code="org.jboss.naming.JNDIBindingServiceMgr"
        name="abc.jndi:name=JNDIProp">
        <attribute name="myprop" serialDataType="jbxb">
            <jndi:bindings
                xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
                xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">               
                <jndi:binding
                    name="Title">
                    <jndi:value type="java.lang.String">
                        @book.01@
                    </jndi:value>
                </jndi:binding>
                <jndi:binding name="Author">
                    <jndi:value type="java.lang.String">
                        @book.01@
                    </jndi:value>
                </jndi:binding>
            </jndi:bindings> 
        </attribute>
    </mbean>
<projects>

预期输出为:book.01.xml

<?xml version="1.0" encoding="UTF-8"?>
<projects>
    <mbean code="org.jboss.naming.JNDIBindingServiceMgr"
        name="abc.jndi:name=JNDIProp">
        <attribute name="myprop" serialDataType="jbxb">
            <jndi:bindings
                xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
                xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">               
                <jndi:binding
                    name="Title">
                    <jndi:value type="java.lang.String">
                        abc
                    </jndi:value>
                </jndi:binding>
                <jndi:binding name="Author">
                    <jndi:value type="java.lang.String">
                        john
                    </jndi:value>
                </jndi:binding>
            </jndi:bindings> 
        </attribute>
    </mbean>
<projects>

但是想知道当我想运行“book.02”或“ebook.03”配置文件/目标的值时应该如何使用相同的模板。

注意:maven 配置文件名称/ant 目标名称将与 template.xml@varaible@名称的变量匹配。示例:mvn -P book.01ant ebook.01

更新:

在@Ken xsl 样式表文件的帮助下,我使用了 xml-maven 插件来转换 template.xml。使用 maven-replacer-plugin 我能够更改@book.01@template.xml 中的变量并将其替换为配置文件名称。

例子:

   <profile>
        <id>book.02</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
    <plugins>
        <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>                    
                </execution>
            </executions>
            <configuration>
                <ignoreMissingFile>true</ignoreMissingFile>
                <file>template.xml</file>
                <outputFile>
                    target/template.xml
                </outputFile>
                <regex>false</regex>
                <token>@book.01@</token>
                <value>@book.02@</value>
            </configuration>
        </plugin>
    </plugins>
4

2 回答 2

2

您是在寻求帮助,还是要求人们为您解决整个问题?很明显,您没有使用上述数据文件,因为它们都不是格式正确的。您要求志愿者在给出完整答案之前修复您的 XML。我建议您以后尝试先解决问题,然后再提出问题。这样一来,您就可以了解您在哪里遇到问题,并且您发布的文件至少格式正确。

下面是一个解决方案,因为我怀疑其他读者可能对使用<xsl:analyze-string>.

t:\ftemp>类型 properties.xml

<?xml version="1.0" encoding="UTF-8"?>
<variables>
    <variable id="Title">
      <book.01>abc</book.01>
      <book.02>def</book.02>
      <ebook.03>ghi</ebook.03>
      <ebook.04>klmn</ebook.04>
    </variable>
    <variable id="Author">
      <book.01>john</book.01>
      <book.02>jack</book.02>
      <ebook.03>simi</ebook.03>
      <ebook.04>laura</ebook.04>
    </variable>
</variables>

t:\ftemp>类型 Template.xml

<?xml version="1.0" encoding="UTF-8"?>
<projects>
    <mbean code="org.jboss.naming.JNDIBindingServiceMgr"
        name="abc.jndi:name=JNDIProp">
        <attribute name="myprop" serialDataType="jbxb">
            <jndi:bindings
                xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
                xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">               
                <jndi:binding
                    name="Title">
                    <jndi:value type="java.lang.String">
                        @book.01@
                    </jndi:value>
                </jndi:binding>
                <jndi:binding name="Author">
                    <jndi:value type="java.lang.String">
                        @book.01@
                    </jndi:value>
                </jndi:binding>
            </jndi:bindings> 
        </attribute>
    </mbean>
</projects>

t:\ftemp>调用 xslt2 Template.xml properties.xsl

<?xml version="1.0" encoding="UTF-8"?><projects>
    <mbean code="org.jboss.naming.JNDIBindingServiceMgr" name="abc.jndi:name=JNDIProp">
        <attribute name="myprop" serialDataType="jbxb">
            <jndi:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns:jndi="urn:jboss:jndi-binding-service:1.0" xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">               
                <jndi:binding name="Title">
                    <jndi:value type="java.lang.String">
                        abc
                    </jndi:value>
                </jndi:binding>
                <jndi:binding name="Author">
                    <jndi:value type="java.lang.String">
                        john
                    </jndi:value>
                </jndi:binding>
            </jndi:bindings> 
        </attribute>
    </mbean>
</projects>

t:\ftemp>类型 properties.xsl

<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

<xsl:key name="props" match="variable/*"
         use="concat(../@id,'&#xd;',name(.))"/>

<xsl:template match="j:value" xmlns:j="urn:jboss:jndi-binding-service:1.0">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:variable name="id" select="../@name"/>
    <xsl:analyze-string select="." regex="@(.*?)@">
      <xsl:matching-substring>
        <xsl:value-of
          select="key('props',concat($id,'&#xd;',regex-group(1)),
                      doc('properties.xml'))"/>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:copy>
</xsl:template>

<xsl:template match="@*|node()"><!--identity for all other nodes-->
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

t:\ftemp>rem 完成!

于 2013-08-12T20:50:54.590 回答
2

您可以使用 XSLT 转换来生成 XML 文件。ANT 有一个内置的xslt 任务

例子

├── build.xml
├── src
│   └── resources
│       ├── properties.xml
│       └── template1.xsl
└── target
    └── result.xml

构建.xml

<project name="demo" default="transform">

   <property name="resources.dir" location="src/resources"/>
   <property name="build.dir"     location="target"/>

   <target name="transform">
      <xslt style="${resources.dir}/template1.xsl" in="${resources.dir}/properties.xml" out="${build.dir}/result.xml"/>
   </target>

   <target name="clean">
      <delete dir="${build.dir}"/>
   </target>

</project>

属性.xml

您的原始数据格式不正确。这是我对正确文件内容的假设:

<?xml version="1.0" encoding="UTF-8"?>
<variables>
    <variable id="Title">
      <book.01>abc</book.01>
      <book.02>def</book.02>
      <ebook.03>ghi</ebook.03>
      <ebook.04>klmn</ebook.04>
    </variable>
    <variable id="Author">
      <book.01>john</book.01>
      <book.02>jack</book.02>
      <ebook.03>simi</ebook.03>
      <ebook.04>laura</ebook.04>
    </variable>
</variables>

模板1.xsl

这是用作输出文件模板的样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
                xmlns:xalan="http://xml.apache.org/xslt"
                xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">

   <xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>

   <xsl:template match="/">
      <projects>
         <mbean code="org.jboss.naming.JNDIBindingServiceMgr" name="abc.jndi:name=JNDIProp">
            <attribute name="myprop" serialDataType="jbxb">
               <jndi:bindings xmlns:jndi="urn:jboss:jndi-binding-service:1.0" >               
                  <xsl:apply-templates select="//variable[@id='Title']/book.01"  mode="title"/>
                  <xsl:apply-templates select="//variable[@id='Author']/book.01" mode="author"/>
               </jndi:bindings> 
            </attribute>
         </mbean>
      </projects>
   </xsl:template>

   <xsl:template match="book.01" mode="title">
      <jndi:binding name="Title">
         <jndi:value type="java.lang.String"><xsl:value-of select="."/></jndi:value>
      </jndi:binding>
   </xsl:template>

   <xsl:template match="book.01" mode="author">
      <jndi:binding name="Author">
         <jndi:value type="java.lang.String"><xsl:value-of select="."/></jndi:value>
      </jndi:binding>
   </xsl:template>

</xsl:stylesheet>

笔记:

  • 此示例使用 XSL 模板模式来匹配依赖于不同 XPATH 搜索条件的不同“book.01”标签。

结果.xml

生成的输出:

<?xml version="1.0" encoding="UTF-8"?>
<projects xmlns:xalan="http://xml.apache.org/xslt" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns:jndi="urn:jboss:jndi-binding-service:1.0">
    <mbean code="org.jboss.naming.JNDIBindingServiceMgr" name="abc.jndi:name=JNDIProp">
        <attribute name="myprop" serialDataType="jbxb">
            <jndi:bindings>
                <jndi:binding name="Title">
                    <jndi:value type="java.lang.String">abc</jndi:value>
                </jndi:binding>
                <jndi:binding name="Author">
                    <jndi:value type="java.lang.String">john</jndi:value>
                </jndi:binding>
            </jndi:bindings>
        </attribute>
    </mbean>
</projects>
于 2013-08-12T20:51:42.467 回答