1

ソース XML をパイプラインで処理するために使用している複数の XSLT ファイルがあります。トリックについては知っていexsl:node-setますが、このワークフローでいくつかの問題が発生した後、さまざまなパスを個別の XSL ファイルに分割することにしました。今ではファイルの構造にとても満足しており、ワークフローは Eclipse でうまく機能します。私たちのリリースシステムは ant で動作します。次のようにファイルを処理できます。

<xslt basedir="src-xml" style="src-xml/preprocess_1.xsl" in="src-xml/original.xml" out="src-xml/temp_1.xml" />
<xslt basedir="src-xml" style="src-xml/preprocess_2.xsl" in="src-xml/temp_1.xml" out="src-xml/temp_2.xml" />
<xslt basedir="src-xml" style="src-xml/preprocess_3.xsl" in="src-xml/temp_2.xml" out="src-xml/temp_3.xml" />
<xslt basedir="src-xml" style="src-xml/finaloutput.xsl" in="src-xml/temp_3.xml" out="${finaloutput}" />

しかし、ディスク上の複数のファイルを経由するこの方法は、効率が悪いようです。antでこれを行うより良い方法はありますか?

Dimitreの提案に従って更新

次のように、他のさまざまな XSL のラッパーを作成しました。

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:fn='http://www.w3.org/2005/xpath-functions' xmlns:exslt="http://exslt.org/common">

<xsl:import href="preprocess_1.xsl"/>
<xsl:import href="preprocess_2.xsl"/>
<xsl:import href="preprocess_3.xsl"/>
<xsl:import href="finaloutput.xsl"/>

<xsl:output method="text" />

<xsl:template match="/">
    <xsl:apply-imports />
</xsl:template>

</xsl:stylesheet>

これは...うまくいきませんでした。最終出力 XSL が実行される前に、ドキュメントが前処理されていないようです。preprocessXSL ファイルは、ドキュメントを変更したり、属性を追加したりしています 。preprocess_3は の出力に基づいています に..._2基づいてい..._1ます。このインポート ソリューションはまだ適切ですか? もしそうなら、私は何が欠けていますか?

4

2 に答える 2

1

より効率的な方法は、単一のマルチパス変換を実行することです。

ファイルはそのままで構いません。xsl:import 命令を使用してインポートされます。

節約は明らかです。

  1. 1 回の開始 (XSLT プロセッサのロード) のみ。

  2. 終了は1回だけです。

  3. 2 つの中間ファイルとその作成、書き込み、閉じ、削除を排除します。

于 2012-10-18T21:20:56.407 に答える
0

うーん、あなたは私が exsl:node-set のトリックについて知っていると言いますが、あなたはそれをあなたの試みで使用していません (「Dimitre の提案に従って更新してください」)。あなたがそれを知らない場合、またはマルチパス変換を実行する方法を知らない他の人 (私のような) のために、ここに素晴らしい記事があります:マルチパス処理

このアプローチの欠点は、エンジン固有の xsl コードが必要なことです。エンジンに詳しい方はぜひ試してみてください。エンジンがわからない場合は、結果ツリーのフラグメントからノードセットまでのソリューションを試すことができます: すべての xsl エンジンの一般的なアプローチ

これらの情報源を見ると、1 つの結論は確かです。現在のソリューションの方が読みやすいということです。ただし、効率を求めているため、読みやすさが犠牲になる可能性があります。

于 2012-11-03T18:54:09.117 に答える