使用 Ant 和 XSLT,我想创建一个 XML 文件,该文件是特定目录中的 XML 文件列表。
Ant 的concat
任务无法完成这项工作,因为我最终得到的列表不是 XML——即它没有一个根元素。
Ant 任务应用的 XSLT 文件,该文件使用 collection()
函数。 这完全产生了我想要的结果,但它尝试为目标目录中的每个文件执行此操作 - 我只想要一个列表。我的 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>
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>
由于 XSLT 本身负责枚举文件名,因此您只需运行一次,即只给它一个文件用作输入,一个文件用作输出。 样式表不使用输入文档中的任何内容,因此只要它是XML,任何输入文件都可以,您可以使用样式表本身作为自己的输入。
<xslt style="create_list.xsl" in="create_list.xsl" out="list.xsl" />
并从样式表中删除<xsl:result-document>
,使其仅输出到默认结果文档(由 build.xml 中的 out="..."
指定的文档)。