在ant for循环中运行Xmltask时出现意外输出

时间:2015-05-19 17:29:50

标签: xml ant ant-contrib xmltask

我正在尝试迭代目录中的一堆文件,并从其文件名创建一个xml文档。 这是代码(省略了taskdef):        

    <target name="test1">

        <for param="file">
            <path>
                <fileset dir="${basedir}/schemas" includes="*.xsd" />
            </path>
            <sequential>
                <echo message="found file  .....@{file}" />
                <xmltask source="wiki.xml" dest="wiki.xml" outputter="simple:4">

                    <insert path="//exported" position="after">
                        <![CDATA[
                                <exported Id="@{file}" />
                        ]]>
                    </insert>
                </xmltask>

                <echo message="------------------------------"/>
                <loadfile property="mymess"
                  srcFile="wiki.xml"/>
                <echo message="${mymess}"/>
                <echo message="------------------------------"/>
        </sequential>
    </for>
</target>
</project>

初始源文件wiki.xml如下所示:

<top>
    <exported Id="Animal_v1"></exported>
</top>

这是调试输出:

test1:
     [echo] found file  .....C:\temp\BranchBS_v1.xsd
     [echo] ------------------------------------------------------------
     [echo] <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     [echo]
     [echo] <top>
     [echo]     <exported Id="Animal_v1"></exported>
     [echo]     <exported Id="C:\temp\schemas\BranchBS_v1.xsd"></exported>
     [echo] </top>
     [echo]
     [echo] ------------------------------------------------------------
     [echo] found file  .....C:\temp\schemas\CalendarEvent_v1.xsd
     [echo] ------------------------------------------------------------
     [echo] <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     [echo]
     [echo] <top>
     [echo]     <exported Id="/Animal_v1"></exported>
     [echo]     <exported Id="C:\temp\schemas\BranchBS_v1.xsd"></exported>
     [echo] </top>
     [echo]
     [echo] ------------------------------------------------------------

这表明第一遍是正确的:它找到了种子&#39;条目(动物)加上刚添加的(分支)。 调试输出看起来像第二次传递没有发生,因为它与第一次传递相同,但是当我在脚本完成时实际查看wiki.xml的内容时,它看起来像这样:

<top>
    <exported Id="Animal_v1"></exported>
    <exported instanceId="C:\temp\schemas\CalendarEvent_v1.xsd"></exported>
    <exported instanceId="C:\temp\schemas\BranchBS_v1.xsd"></exported>
    <exported instanceId="C:\temp\schemas\CalendarEvent_v1.xsd"></exported>
</top>

因此它不仅编写了CalendarEvent记录(调试中缺少),而且还执行了两次!

我真的很困惑。

2 个答案:

答案 0 :(得分:0)

Ant属性是不可变的 - ${mymess}的值在第一次加载文件内容时不会改变。由于您使用的是ant-contrib,因此可以在使用var任务加载之前取消设置该属性:

<var name="mymess" unset="true" />
<loadfile property="mymess" srcFile="wiki.xml"/>

答案 1 :(得分:0)

正如@manouti报道的那样,对于调试,你在循环中重用不可变属性,因此它的值不会发生变化。 简单的解决方案:使用&#39; local&#39;蚂蚁任务,例如:

            <echo message="------------------------------"/>
            <local name="mymess"/> <!-- declares a local scope for "mymess" -->
            <loadfile property="mymess"
              srcFile="wiki.xml"/>
            <echo message="${mymess}"/>
            <echo message="------------------------------"/>

你的第二个问题与你的xpath语法有关,你要求xmltask在每个预先存在的&#34;导出&#34;之后插入一个节点。节点。因此,第二次,你插入两次。 相反,你想要:

             <insert path="//exported[last()]" position="after">

例如,见other SO question