在我以前的post中,我试图实现macrodef以便用“类似于函数”任务代替重复的代码块。然后我遇到了一些问题。之后,我减少了脚本,因此我可以尝试不使用的任务。这是我组成的:

<project basedir="../../../" name="do-report" default="extract-common-paths">
    <xmlproperty keeproot="false" file="implementation/xml/ant/properties.xml"/>
    <!--    -->
    <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
            <pathelement location="${infrastructure-base-dir}/apache-ant-1.9.6/lib/antcontrib.jar"/>
        </classpath>
    </taskdef>
    <!--    -->
    <macrodef name="get-common-path">
        <attribute name="common-path-property"/>
        <attribute name="file"/>
        <attribute name="file-base-dir"/>
        <sequential>
            <local name="file-dir-absolute-path"/>
            <dirname property="file-dir-absolute-path" file="@{file}"/>
            <property name="file-base-dir-absolute-path" location="@{file-base-dir}"/>
            <echo>MACRODEF FILE: ${file-dir-absolute-path}</echo>
            <echo>MACRODEF FILE-BASE-DIR: ${file-base-dir-absolute-path}</echo>
            <pathconvert property="@{common-path-property}" dirsep="/">
                <path location="${file-dir-absolute-path}"/>
                <map from="${file-base-dir-absolute-path}/" to=""/>
            </pathconvert>
        </sequential>
    </macrodef>
    <!--    -->
    <target name="clean">
        <delete dir="${dita-odt.path.odt-unzipped-base-dir}" includeemptydirs="true" failonerror="no"/>
        <delete dir="examples/intermediate/odt-files" includeemptydirs="true" failonerror="no"/>
    </target>
    <!--    -->
    <target name="unzip-writing-odt-file" depends="clean">
        <unzip src="${dita-odt.path.writing-odt}" dest="${dita-odt.path.writing-odt-unzipped}"/>
    </target>
    <!--    -->
    <target name="extract-common-paths" depends="unzip-writing-odt-file">
        <for param="file">
            <path>
                <fileset dir="${dita-odt.path.text-xml-base-dir}">
                    <include name="**/content.xml"/>
                </fileset>
            </path>
            <sequential>
                <get-common-path common-path-property="common-path" file="@{file}" file-base-dir="${dita-odt.path.text-xml-base-dir}"/>
                <echo>THIS IS THE PATH: ${common-path}</echo>
            </sequential>
        </for>
    </target>
</project>


FOR任务遍历不同目录中的两个文件。实际上FOR可以按预期工作。它按需通过${file}。首先将macrodef属性common-path-property设置为第一个文件的转换路径(可以)。但是,当第二个文件传递给get-common-path/@file时,属性common-path-property不会改变其值,我再次收到以下消息:


  [echo] MACRODEF文件:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text \ t1 \ t1.1
  
  [echo] MACRODEF文件基础目录:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text
  
  [回声]这就是路径:t1 / t1.1
  
  [echo] MACRODEF文件:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text \ t2 \ t2.1
  
  [echo] MACRODEF文件基础目录:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text
  
  [回声]这就是路径:t1 / t1.1


相反,我希望收到以下信息:


  [echo] MACRODEF文件:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text \ t1 \ t1.1
  
  [echo] MACRODEF文件基础目录:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text
  
  [回声]这就是路径:t1 / t1.1
  
  [echo] MACRODEF文件:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text \ t2 \ t2.1
  
  [echo] MACRODEF文件基础目录:C:\ Users \ rmrd001 \ git \ xslt-framework \ examples \ text
  
  [回声]这就是路径:\ t2 \ t2.1


希望您了解我正在尝试做的事情。先感谢您!

最佳答案

尝试打印macrodef属性值而不是属性值。


@{attribute}-可以在每次执行macrodef时更改
${property}-始终仅在Ant中设置和固定一次,即使在宏定义中也是如此


除非在<local>任务之前,否则在该块的范围内使用本地设置的属性值。



可能您想要的由Ant Local task提供。


  将本地属性添加到当前范围。属性范围存在于
  Apache Ant的各种“块”级别。

07-24 09:55