簡體   English   中英

如何僅使用Ant和XSLT創建目標目錄中的文件列表的XML文件?

[英]How can I create an XML file that is a list of files in a target directory using only Ant and XSLT?

僅使用Ant和XSLT,我想創建一個XML文件,它是特定目錄中的XML文件列表。

Ant的concat任務不起作用,因為我最終得到的是一個不是XML的列表 - 即。 它沒有單個根元素。

我有一個XSLT文件,我使用XSLT Ant任務,使用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="..."指定的文檔)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM