首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在<macrodef>中使用<foreach>?

如何在<macrodef>中使用<foreach>?
EN

Stack Overflow用户
提问于 2013-01-22 19:18:41
回答 3查看 2.5K关注 0票数 4

我有一个如下所示的xml:

代码语言:javascript
复制
<data>

    <foo>value1</foo>

    <foo>value2</foo>

    <foo>value3</foo>

  </data>

我想创建实现以下功能的宏定义:

代码语言:javascript
复制
<?xml version="1.0"?>
<project name="OATS" default="execute" basedir=".">

  <xmlproperty file="data.xml" collapseAttributes="true"/>
  <target name="execute">
    <foreach list="${data.foo}" target="runScript" param="script"/>
  </target>
  <target name="runScript">
    <echo>Doing things with ${script}</echo>
  </target>
</project>

有人知道怎么做吗?提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-01-23 18:25:02

在Ant社区中,xmltask是实现这一目的的最佳选择,您不必定义自己的宏定义。

举个例子:

代码语言:javascript
复制
  <tools:xmltask source="data.xml" report="false" >
    <tools:call path="data/foo">
      <param name="value" path="text()"/>
      <actions>
          <echo>Doing things with @{value}</echo>
      </actions>
    </tools:call>
  </tools:xmltask>

我建议您阅读用户手册,因为xmltask有很多选项。它基本上支持XPath来提取和迭代xml的任何部分。除了匿名代码块之外,它还支持对现有目标的调用(如示例中所示)。

这是很难被打败的。

票数 3
EN

Stack Overflow用户

发布于 2013-01-23 03:23:23

下面的示例使用groovy ANT task

代码语言:javascript
复制
<project name="OATS" default="execute" basedir=".">

    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
        <classpath>
            <pathelement location="lib/groovy-all-2.1.0-rc-2.jar"/>
        </classpath>
    </taskdef>

    <target name="execute">
        <groovy>
            def data = new XmlSlurper().parse(new File("data.xml"))

            data.foo.each {
                properties["script"] = it
                ant.project.executeTarget("runScript")
            }
        </groovy>
    </target>

    <target name="runScript">
        <echo>Doing things with ${script}</echo>
    </target>

</project>
票数 0
EN

Stack Overflow用户

发布于 2013-01-23 09:18:20

这是我的宏定义。

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="OATS" default="test" basedir=".">
        <property environment = "env"/>
      <path id = "antcontrib.path">
        <fileset file = "${env.ANT_HOME}/../net.sf.antcontrib_1.1.0.0_1-0b2/lib/ant-contrib.jar"/>
      </path>
      <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="antcontrib.path"/>
      <macrodef name="runOATS">
            <attribute name="suite"/>
            <attribute name="toDir"/>
            <sequential>
                <delete dir="@{toDir}"/>
                <mkdir dir="@{toDir}"/>
                <xmlproperty file="@{suite}" collapseAttributes="true"/>
                <for list="${data.foo}" param="script">
                    <sequential>
                        <runScript script="@{script}"/>
                    </sequential>
                </for>
            </sequential>
        </macrodef>             
        <macrodef name="runScript">
            <attribute name="script"/>
            <sequential>
                <echo>Doing things with @{script}</echo>
            </sequential>
        </macrodef>
        <target name="test">
            <runOATS toDir="/OATS/results" suite="data.xml"/>
        </target>
 </project>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14457360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档