1

Ant と XSLT だけを使用して、特定のディレクトリにある XML ファイルのリストである XML ファイルを作成したいと考えています。

Antのconcatタスクは、XMLではないリストになるため、仕事をしません。単一のルート要素はありません。

関数を使用する XSLT Ant タスクを使用して適用する XSLT ファイルがありますcollection()。これはまさに私が望む結果を生成しますが、ターゲットディレクトリ内の各ファイルに対してそうしようとします.1つのリストだけが必要です. 私の 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>
4

2 に答える 2

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>
于 2013-09-25T15:04:38.693 に答える
1

XSLT 自体がファイル名の列挙を処理するので、XSLT を 1 回実行するだけで済みます。つまり、入力として使用するファイルを 1 つ、出力として使用するファイルを 1 つだけ指定します。スタイルシートは入力ドキュメントから何も使用しないため、入力ファイルが XML である限り、スタイルシート自体を独自の入力として使用できます。

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

スタイルシートからを削除し<xsl:result-document>て、デフォルトの結果ドキュメント ( out="..."build.xml で指定されたもの) に出力するだけにします。

于 2013-09-25T14:55:27.860 に答える