如果存在/设置特定属性,则xmlproperty并检索xml元素的属性值

use*_*504 2 ant

我的Xml看起来像:

<root>
        <foo location="bar"/>
        <foo location="in" flag="123"/>
        <foo location="pak"/>
        <foo location="us" flag="256"/>
        <foo location="blah"/>
</root>
Run Code Online (Sandbox Code Playgroud)

对于foo,xml元素标志是可选属性.

当我说:

<xmlproperty file="${base.dir}/build/my.xml" keeproot="false"/>

 <echo message="foo(location) : ${foo(location)}"/>
Run Code Online (Sandbox Code Playgroud)

打印所有位置:

foo(location) : bar,in,pak,us,blah
Run Code Online (Sandbox Code Playgroud)

只有当flag设置为某个值时,才有办法获取位置吗?

Ian*_*rts 6

只有当flag设置为某个值时,才有办法获取位置吗?

不是xmlproperty,不,因为它总是会混淆具有相同标记名称的值.但是xmltask可以做你需要的,因为它支持XPath的全部功能:

<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask">
  <classpath path="xmltask.jar" />
</taskdef>

<xmltask source="${base.dir}/build/my.xml">
  <copy path="/root/foo[@flag='123' or @flag='256']/@location"
        property="foo.location"
        append="true" propertySeparator="," />
</xmltask>
<echo>${foo.location}</echo><!-- prints in,us -->
Run Code Online (Sandbox Code Playgroud)

如果你绝对不能使用第三方的任务,那么我可能会用一个简单的XSLT来提取你的XML的只是位处理这个问题需要到另一个文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="targetFlag" />

  <xsl:template name="ident" match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <xsl:template match="foo">
    <xsl:if test="@flag = $targetFlag">
      <xsl:call-template name="ident" />
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

用这个xslt任务调用它

<xslt in="${base.dir}/build/my.xml" out="filtered.xml" style="extract.xsl">
  <param name="targetFlag" expression="123" />
</xslt>
Run Code Online (Sandbox Code Playgroud)

这将创建filtered.xml包含just

<root>
        <foo location="in" flag="123"/>
</root>
Run Code Online (Sandbox Code Playgroud)

(以空格为模的变化),您可以使用xmlproperty以正常方式加载它.