5

質問

ビルド時に 1 つのマスター バージョンにマージする多数の xml 構成ファイルがあります。構成ファイルが小さいほど保守が容易になり、1 つの大きなファイルの読み込みが速くなるため、これは一般的なビルド変換プロセスであり、ネット上で多くの良い例を見つけることができると想像しました。

ここ StackOverflow で問題の一部に対するいくつかの優れた解決策を見つけることができましたが、それらはすべて、事前にマージする必要がある xml ファイルの名前を知っていることに依存しています。これは私には不必要なオーバーヘッドのようです。どの入力 xml ファイルが必要かを動的に計算できるビルド スクリプトを作成できるはずです。

残念ながら、これを達成するために私が見つけた唯一の方法は、ちょっとしたハックでした。それはこのように動作します、

  1. インターネットから盗んだランダムなアリ タスクを使用して、ディレクトリ リストを xml ファイルに書き込みます。
  2. xml ファイルを xslt 変換にフィードすると、参照されている他のディレクトリ リストの xml ファイルを読み込んでそれらを連結できます。
  3. ディレクトリ リストを含む一時 xml ファイルを削除します。

これがantスクリプトです

<taskdef name="xml-dir-list"
  classname="net.matthaynes.xml.dirlist.AntFileListing"
  classpath="antlib/xml-dir-listing.0.1.jar;
    antlib/jakarta-regexp-1.5.jar;antlib/log4j-1.2.14.jar"/>

<macrodef name="build-plugin-xml" description="todo">
    <attribute name="pluginName"/>

    <xml-dir-list depth="0" verbose="false" 
      srcDir="${src.dir}/@{pluginName}/forms/" includesRegEx="\.xml$" 
      destFile="${src.dir}/@{pluginName}/forms/fileList.xml"/>

    <xslt in="${src.dir}/forms/fileList.xml"
      out="${src.dir}/@{pluginName}/@{pluginName}_extn.yuix
      style="${src.dir}/@{pluginName}/forms/extn.yuix.xsl" />

    <delete file="${src.dir}/@{pluginName}/forms/fileList.xml"/>
</macrodef>

そして、これがスタイルシートです。

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <Forms applicationId="YFSSYS00011">
            <GlobalExtensions>
                <Tasks/>
            </GlobalExtensions> 
            <xsl:apply-templates select="directory/file"/>
        </Forms>
    </xsl:template>

    <xsl:template match="file">
        <xsl:copy-of select="document(@name)/Forms/Form"/>
    </xsl:template>
</xsl:stylesheet>

XSLT でマージするファイルを動的に検出する簡単な方法を見つけた人はいますか? XSLT がディレクトリを直接読み取ることができないのは当然のことですが、ファイル名のリストを別の xml ファイルを介して渡すよりも簡単な方法を見つけたいと思っていました。

実装されたソリューション

Dimitre のソリューションは、Ant スクリプトにいくつかの追加調整を加えるとうまく機能しました。

<taskdef name="saxon-xslt" classname="net.sf.saxon.ant.AntTransform"
  classpath="antlib/saxon9.jar;antlib/saxon9-ant.jar"/>

[...]

<macrodef name="build-plugin-xml" description="todo">
    <attribute name="pluginName"/>

    <saxon-xslt 
      in="build.xml"
      out="${compca.src.dir}/temp/@{pluginName}/@{pluginName}_extn.yuix"
      style="antscripts/extn.yuix.xsl">
    <param name="formsDir" 
      expression="${compca.src.dir}/@{pluginName}/forms/"/>
    </saxon-xslt>
</macrodef>

および xsl スタイルシート (移動しました)

   <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:param name="formsDir" />
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

        <xsl:template match="/">
            <Forms applicationId="YFSSYS00011">
                <GlobalExtensions>
                    <Tasks/>
                </GlobalExtensions>
                <xsl:apply-templates select=
                  "collection(
                  concat('file:///',
                  $formsDir,
                  '?select=*.yuix;recurse=yes;on-error=ignore'
                  )
                  )/*
                "/>
            </Forms>

        </xsl:template>

        <xsl:template match="file">
            <xsl:copy-of select="/Forms/Form"/>
        </xsl:template>
    </xsl:stylesheet>

これらの調整は、Saxon9 をロードして、パラメーターを使用してディレクトリを設定することに関するものでした。

4

1 に答える 1