Как <foreach> в <macrodef>?
У меня есть XML, как показано ниже:
<data>
<foo>value1</foo>
<foo>value2</foo>
<foo>value3</foo>
</data>
Я хочу создать macrodef, который реализует функцию ниже:
<?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>
Кто-нибудь знает как? Заранее спасибо.
3 ответа
xmltask - лучший выбор в сообществе Ant для этой цели, и вам не нужно определять свою собственную макроопределение.
Так, например:
<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. Он также поддерживает вызовы к существующим целям в дополнение к анонимным кодовым блокам (как в примере).
Это просто трудно победить.
В следующем примере используется заводская задача ANT
<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>
Это мой макродеф.
<?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>