如何仅使用Ant和XSLT创建目标目录中的文件列表的XML文件?

时间:2013-09-25 13:29:14

标签: xml xslt ant

仅使用Ant和XSLT,我想创建一个XML文件,该文件是特定目录中的XML文件列表。

Ant的concat任务没有完成工作,因为我最终得到的列表不是XML - 即。它没有单个根元素。

我使用XSLT Ant任务应用了一个使用collection()函数的XSLT文件。这产生了我想要的结果,但它尝试对目标目录中的每个文件执行此操作 - 我只想要一个列表。我的XSLT正在目标目录(集合)中的每个文件上运行 - 如何限制应用XSLT的时间数?

这是我到目前为止所拥有的:

XML文件位于目标目录c:\tmp

这是我应用于目标目录中的文件的XSL文件(使用Ant XSLT任务);

 <xsl:template match="/">
    <xsl:call-template name="generatelist" />
</xsl:template>

<xsl:template name="generatelist">
    <xsl:result-document href="list.xml">
        <xsl:element name="list">
            <xsl:element name="dir">
                <xsl:for-each
                    select="collection('file:///C:/tmp?select=*.xml')">
                    <xsl:element name="file">
                        <xsl:attribute name="name">
                            <xsl:value-of select="tokenize(document-uri(.), '/')[last()]" />
                        </xsl:attribute>
                    </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </xsl:element>
    </xsl:result-document>
</xsl:template>

这是生成的XML列表:

<list>
    <dir>
        <file name="filename_1.xml"/>
        <file name="filename_2.xml"/>
         . . .
        <file name="filename_n.xml"/>
    </dir>
</list>

感谢。

德鲁

添加我使用的Ant XSLT任务:

<xslt basedir="${staging_2}"
      destdir="${staging_3}" extension=".xml" includes="**/*.xml"
      style="create_list.xsl">     
</xslt>

2 个答案:

答案 0 :(得分:3)

XSLT确实不适合您的需求。 XSLT最适合将XML转换为新的XML。但是,在这种情况下,源不是XML;它是一个文件系统目录。

鉴于此,可以直接生成XML。以下Ant脚本使用第三方Ant-Contrib库的<for>任务:

<project name="ant-echo-xml" default="run" basedir=".">
    <taskdef resource="net/sf/antcontrib/antlib.xml" />

    <target name="run">
        <property name="dest-xml.file" value="list.xml"/>

        <echo file="${dest-xml.file}"
><![CDATA[<list>
    <dir>
]]></echo>

        <for param="src-xml.absolute-path">
            <fileset dir="my-dir" includes="*.xml"/>
            <sequential>
                <local name="src-xml.basename"/>
                <basename property="src-xml.basename" file="@{src-xml.absolute-path}"/>

                <echo file="${dest-xml.file}" append="yes"
>        <![CDATA[<file name="${src-xml.basename}"/>
]]></echo>
            </sequential>
        </for>

        <echo file="${dest-xml.file}" append="yes"
><![CDATA[    </dir>
</list>
]]></echo>
    </target>
</project>

输出:

<list>
    <dir>
        <file name="filename_1.xml"/>
        <file name="filename_2.xml"/>
    </dir>
</list>

答案 1 :(得分:1)

由于XSLT本身负责枚举文件名,您只需要运行一次,即只给它一个文件用作输入,一个文件用作输出。样式表不使用输入文档中的任何内容,因此任何输入文件都可以使用XML,您可以使用样式表本身作为自己的输入。

<xslt style="create_list.xsl" in="create_list.xsl" out="list.xsl" />

并从样式表中删除<xsl:result-document>,以便它只输出到默认结果文档(build.xml中由out="..."指定的文档)。