使用相同的输入和输出文件使用ant xslt任务

时间:2014-07-18 14:04:42

标签: xslt ant

似乎无法运行ant xslt任务来使用输入文件作为任何临时文件的输出文件对xml(例如)进行排序。

我使用以下目标对所有arxml文件的内容进行排序。

<target name="sort_arxml" depends="init" description="Do a XLST on all arxml files to sort their content">
    <tempfile property="sort.xslt" suffix=".xslt" deleteonexit="true" />
    <echo file="${sort.xslt}">
        <![CDATA[
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:template match="@*|node()">
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()">
                        <xsl:sort select="child::*"/>
                    </xsl:apply-templates>
                </xsl:copy>
            </xsl:template>
        </xsl:stylesheet>
        ]]></echo>
    <xslt style="${sort.xslt}" basedir="../Config" destdir="../Config" extension=".arxml" includes="**/*.arxml" excludes="**/AUTOSAR*"/>
</target>

但我不能这样做,因为它返回一个例外

java.io.FileNotFoundException: xxxx\Config\Developer\ComponentTypes\yyyy.arxml (Access is denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
    at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:185)
    at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:816)

如果我使用不同的扩展程序,它可以工作但我必须将文件复制回原始文件。

有人修好了吗?如果,怎么样? 这是变压器的问题吗?

系统信息:

Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Detected Java version: 1.7 in: C:\Program Files\Java\jdk1.7.0_45\jre
Detected OS: Windows 7

2 个答案:

答案 0 :(得分:4)

XSLT本身无法写入其输入文件,因此ant XSLT任务无法帮助您实现目标。

顺便说一下,创建临时文件或目录没有任何问题,将XSLT输入与输出分开是有好处的。 ant XSLT任务可以检测何时需要重新运行转换,并且在输入和输出文件不同时便于调试。你可能最好不要试图反对谷物。

如果无法设计输出文件与输入文件相同的需求,只需写入单独的输出目录并在转换后将输入目录替换为输出目录:

<target name="sort_arxml" depends="init" 
        description="Do a XLST on all arxml files to sort their content">

    <!-- [ same as in question ] -->

    <xslt style="${sort.xslt}" basedir="../Config" destdir="../ConfigTMP" 
          extension=".arxml" includes="**/*.arxml" excludes="**/AUTOSAR*"/>

    <delete dir="../Config"/>
    <move file="../ConfigTMP" tofile="../Config"/>

</target>

答案 1 :(得分:0)

您无法同时读取/写入同一文件。

您必须选择另一个输出文件名(或不同的文件夹),然后用新文件替换旧文件。

默认情况下,ant Move Task会覆盖现有文件。