2

私は特定の問題を抱えており、どのようにアプローチすればよいかわかりません。ここのオフィスには、あるタイプの XML を別のタイプの XML に適応させるために持っている、この大きくて扱いにくい XSLT があります。問題は、それがあまり一貫して書かれておらず、従うのが非常に難しいことです。このスタイルシートの古代の作成では、それが何をするのか正確に忘れられていたようです。

巨大な XSLT とまったく同じように、人間が読める形式で簡単にマッピングする方法はありますか? つまり、すべての可能な入力 -> すべての可能な出力。アダプターは入力ごとに異なる動作をするため、包括的な入力ドキュメントを作成することはできません (考えられるすべての出力をカバーするには、100 以上の入力ドキュメントが必要になると見積もっています)。

どんな提案でも大歓迎です。

4

4 に答える 4

1

それを分割します -- xsl 実行ステートメントをドキュメント内の xsl テンプレートに移動します。これを行うことで、文書を上から下へとより合理的に理解できるようになります。

そして、それが非常に巨大で理解できない場合、これはリファクタリングの決定を迫られているように思えます: このドキュメントは非常に重要なので、それが何をするのかを知る必要があります (そして、それがどのように機能するかを理解する必要があります)。再作業が必要です)、またはそのまま使用できますか?

于 2009-02-24T15:49:47.620 に答える
1

入力書類を理解していますか?

はいの場合、次の文をスキップします。そうでない場合、いいえ:-

そうすると、結果として得られる XSLT のリファクタリングをテストすることはできないため、この質問に対する答えを「はい」にする必要があります。

出力ドキュメントを理解していますか?

はいの場合、次の文をスキップします。そうでない場合、いいえ:-

その後、結果として得られる XSLT のリファクタリングをテストすることはできないため、この質問に対する答えを「はい」にする必要があります。

両方の質問に対する答えが「はい」になったので、XSLT を捨てて、理解できるものを構築してください。入力が何であるかを知っていて、必要な出力を知っている、古典的なフォン・ニューマン (最近でもそれを教えていますか?)。

于 2009-02-24T15:49:50.037 に答える
1

一般に、これは不可能なタスクです。どのプログラミング言語でも!

これは、停止問題の決定不能性に由来します。

したがって、不可能であることが証明されていることをしようとして、多大な努力をするかもしれません。

私の推奨事項 は、プログラミングのベスト プラクティスに従い、単体テストを使用し、可能であれば正当性の証明を使用して、独自のソリューションを作成することです。関数型言語としての XSLT は、正確性を証明するのにより適しています。

于 2009-02-24T17:22:05.930 に答える
0

これはおそらくあなたを助けるつもりはありません。しかし、私は私の経験を共有します。

XSLT仕様が構文解析に関して何を言っているのかを理解しようとして同じ問題を抱えていたのは昨日だけでした。私が自分自身を助けるためにしたことは、元の XSL にいくつかの関数 (xsl:template の、ペダンティックにするため) を追加することでした。次に、ブラウザで実行したところ、ほら、DFS の全体像がはっきりとわかりました。

私は以下を作成しました:

<xsl:template name="print">
<xsl:param name="message"/>
<xsl:param name="elem"/>
<div class="ArticleBody">
  <br/>
  <xsl:value-of select="$message"/>: <xsl:value-of select="$elem"/> ... <br/>
</div>

テンプレートはprintワーカーで、プロローグとエピローグは単にprintカスタム文字列で呼び出します。

そして、元の XSL ファイルを次のように変更します。

<xsl:template match="db:para">
 <xsl:apply-templates/>
</xsl:template>

に:

<xsl:template match="db:para">
 <xsl:call-template name="prologue">
   <xsl:with-param name="item" select="'para'"/>
 </xsl:call-template>
 <xsl:apply-templates/>
 <xsl:call-template name="epilogue">
  <xsl:with-param name="item" select="'para'"/>
 </xsl:call-template>

すべてのノードが処理されると、出力が得られます。

start-processing: article ... 

そして完成したら

end-processing: article ...

見栄えを良くするために、(ルート ノードの処理時に) CSS も少し入れました。そして、それは私の一日を作りました:)

于 2009-02-24T15:49:27.403 に答える