java - Macro Def 属性不会改变其值

标签 java xml xslt ant ant-contrib

在我之前的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 FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t1\t1.1

[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text

[echo] THIS IS THE PATH: t1/t1.1

[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t2\t2.1

[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text

[echo] THIS IS THE PATH: t1/t1.1

相反,我希望收到这个:

[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t1\t1.1

[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text

[echo] THIS IS THE PATH: t1/t1.1

[echo] MACRODEF FILE: C:\Users\rmrd001\git\xslt-framework\examples\text\t2\t2.1

[echo] MACRODEF FILE-BASE-DIR: C:\Users\rmrd001\git\xslt-framework\examples\text

[echo] THIS IS THE PATH: \t2\t2.1

我希望你明白我想做什么。预先感谢您!

最佳答案

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

  • @{attribute} - 可以随着宏定义的每次执行而改变
  • ${property} - 总是在 Ant 中设置和固定一次,即使在宏定义中也是如此
    • 除非前面有 <local>任务,在这种情况下,本地设置的属性值将在该 block 的范围内使用。

也许你想要的东西是 Ant 提供的 Local task .

Adds a local property to the current scope. Property scopes exist at Apache Ant's various "block" levels.

关于java - Macro Def 属性不会改变其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34355102/

相关文章:

Java Regex - 如何替换以以下开头和结尾的模式

java - ForkJoinPool 在 invokeAll/join 期间停止

java - java中.split()方法如何工作?

c# - .NET:在验证/读取 XML 模式时阻止 Web 访问?

xml - 如何使用 MSXML2 检测外部 XML 文档中的命名空间?

xslt - 如何测试XSL中缺少的属性?

java - 在语句中使用 sql 变量时突然出现 SQL 异常

javascript - 如何使用 javascript 读取包含 html 标签的 XML 文件上的 Childnode 内容

php - 通过php将xml数据插入mysql数据库

c# - 调用 format-number XPath 函数时,收到错误 : "Namespace Manager or XsltContext needed."