Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用概要文件或目标文件使用模板文件从xml属性文件获取值_Xml_Maven_Xslt_Ant_Maven Plugin - Fatal编程技术网

如何使用概要文件或目标文件使用模板文件从xml属性文件获取值

如何使用概要文件或目标文件使用模板文件从xml属性文件获取值,xml,maven,xslt,ant,maven-plugin,Xml,Maven,Xslt,Ant,Maven Plugin,使用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> <e

使用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>
<?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>

你是在寻求帮助,还是在寻求别人帮你解决整个问题?很明显,您没有使用上述数据文件,因为它们都不是格式良好的。您要求志愿者在给出完整答案之前修复XML。我建议你以后先解决问题,然后再提问。这样你就可以知道你在理解上有什么问题,你发布的文件至少是格式良好的

下面是一个解决方案,因为我怀疑其他读者可能对使用
的方法感兴趣

t:\ftemp>type 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>

abc
def
ghi
吉隆坡
厕所
杰克
西米
劳拉
t:\ftemp>type 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>

@第1.01册@
@第1.01册@
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>
<?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>

abc
厕所
t:\ftemp>type 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>
<?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完成

你是在寻求帮助,还是在寻求别人帮你解决整个问题?很明显,您没有使用上述数据文件,因为它们都不是格式良好的。您要求志愿者在给出完整答案之前修复XML。我建议你以后先解决问题,然后再提问。这样你就可以知道你在理解上有什么问题,你发布的文件至少是格式良好的

下面是一个解决方案,因为我怀疑其他读者可能对使用
的方法感兴趣

t:\ftemp>type 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>

abc
def
ghi
吉隆坡
厕所
杰克
西米
劳拉
t:\ftemp>type 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>

@第1.01册@
@第1.01册@
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>
<?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>

abc
厕所
t:\ftemp>type 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>
<?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完成

您可以使用XSLT转换来生成XML文件。蚂蚁有一个内置的

例子 编译文件

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>

abc
def
ghi
吉隆坡
厕所
杰克
西米
劳拉
template1.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”标记
result.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>

abc
厕所

您可以使用XSLT转换生成XML文件。蚂蚁有一个内置的

例子 编译文件

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>

abc
def
ghi
吉隆坡
厕所
杰克
西米
劳拉
template1.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”标记
result.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>

abc
厕所

我试图了解此解决方案如何响应任意XML输入模板文件。它似乎是硬编码的,将模板文件替换为样式表,据我所知,这不是原始海报想要的。如果给原始海报一个套利者