如何使用概要文件或目标文件使用模板文件从xml属性文件获取值
使用Maven或Ant希望从xml文件中获取值,并使用目标/概要文件将其替换为变量 properties.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
<?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,'
',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,'
',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,'
',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,'
',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,'
',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,'
',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,'
',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,'
',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”标记
<?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”标记
<?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输入模板文件。它似乎是硬编码的,将模板文件替换为样式表,据我所知,这不是原始海报想要的。如果给原始海报一个套利者