2013-09-25 83 views
1

僅使用Ant和XSLT,我想創建一個XML文件,該文件是特定目錄中XML文件的列表。如何使用Ant和XSLT創建一個僅包含目標目錄中文件列表的XML文件?

Ant的concat任務不會完成這項工作,因爲我最終得到的不是XML的列表 - 即。它沒有單個根元素。

我有一個使用XSLT Ant任務的XSLT文件,它使用collection()函數。這產生了我想要的結果,但它試圖爲目標目錄中的每個文件這樣做 - 我只需要一個列表。我的XSLT正在目標目錄(集合)中的每個文件上運行 - 我如何限制XSLT應用的時間點數量?

這是我到目前爲止有:

XML文件在目標目錄c:\tmp

這是我申請的文件在目標目錄(使用Ant的XSLT任務)XSL文件;

<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> 
+0

因此,有似乎是沒有錯的XSLT,問題是在Ant代碼調用它。你能發佈你的build.xml的相關片段嗎? –

+0

感謝您的快速響應,伊恩 - 我已經添加了XSLT任務。 – Drew

+0

當XML文件處於相對路徑(例如,在$ {BUILDDIR} /文件而不是C:\ Tmp)時,你會如何工作?我試過類似'collection(iri-to-uri('./ files /?select = *。xml')',但那不是。 – Scribblemacher

回答

1

由於XSLT本身需要列舉的文件名的照顧,你只需要運行一次,即給它只是一個文件用作輸入,一個文件用作輸出。樣式表不使用輸入文檔中的任何內容,因此任何輸入文件只要是XML就可以使用,您可以使用樣式表本身作爲自己的輸入。

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

和從樣式表中刪除<xsl:result-document>以便它只是輸出到默認結果文檔(由out="..." build.xml中指定的)。

+0

這很完美 - 非常感謝Ian。我曾考慮過使用某種'虛擬'文件,但是我無法弄清楚如何將其加入'basedir'中,而且我事先不知道''basedir'中的文件名稱。使用.xsl文件作爲虛擬輸入是一個好主意。再次感謝。 – Drew

3

XSLT真的不適合您的需要。 XSLT最適合將XML轉換爲新的XML。但是,在這種情況下,源不是XML;它是一個文件系統目錄。

鑑於此,直接生成XML是很好的。下面的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> 
+0

感謝您的回答,乍得和執行此工作的Ant代碼。我更喜歡XSLT,但我保留一份代碼以備將來使用。 - Drew – Drew

+0

請注意,如果您使用Ant pre-1.8,則需要將''更改爲''(由ant-contrib提供)。 – Scribblemacher

相關問題