2012-01-05 11 views
2

(私はプロトコルを怒らし、私を困らかもしれない一般的な戦略の質問を危険にさらすしてみましょう。)XSLT 1.0予備処理戦略

HTMLへの私の入力XMLの要素ごとの変換前に、私は順序を決定する必要があります要素が提示されます。そうするためには、提示される要素の属性に基づいて、順序付きリストをマージし、グラフをトレースすることを含む再帰的分析が必要です。

この処理の後、実際には属性値の順序付きリストがあり、そのリストでソートされた要素を提示します。

どちらの方針が良いですか?

1)属性値のリストとなり、グローバル変数、に事前分析の結果を入れて、そのリストを反復、このような何か:

<xsl:variable name=orderOfPresentation> 
    <xsl:call-template name="analyses"> 
</xsl:variable> 


<xsl:template match="root"> 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

または

2)、再帰を閉じることなく、このような何かを命じたリストが決定された後の分析、深いテンプレートの書式を適用:

<xsl:template match="root"> 
    <xsl:call-template name="analysis"> 
     [with, as parameters, various sets of attribute nodes, extracted from the input XML] 
    </xsl:call-template> 
</xsl:template> 


<xsl:template name="analysis"> 
    [recursions that include calls to sub-analysis] 
</xsl:template> 

<xsl:template name="sub-analysis"> 
    [recursions that include calls to sub-sub-analysis]] 
</xsl:template> 

<xsl:template name="sub-sub-analysis"> 
    [more work, which eventually produces an ordered list, $orderOfPresentation] 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

F最初の戦略は、手続き型言語プログラマの考えを明らかにするだけかもしれませんが、実際の変換のビジネスに乗り出す前に、プロセッサがそれ自体を後にするようにする利点があるようです。

しかし、XLST 1.0(拡張機能なしで動作しなければならない)では、文字列値のリストを表す簡単な方法がなく、(これを正しく理解すれば)グローバル変数に戻すことしかできません木の断片(私が理解していない何か)。だから戦略(1)は悪いようです。

しかし、(2)は、すべての実際の変換を再帰の内側から深く呼び出す戦略は、非効率的で維持が難しいようです。

これらの戦略の1つがベストプラクティスですか?それとも、どちらも混乱した心の証拠ですか?

+0

XSLTプロセッサの呼び出し元の環境はどのように見えますか?ソートのために最初のXSLTプログラムを適用し、結果のXMLをどこかに保存し、これを "XMLからHTMLへ"変換する2番目のXSLTプログラムで処理する機会はありますか?これは私がここで試してみるものです。 –

+0

変換はクライアント側でWebブラウザで実行されています。だから、中間XMLを保存することはできません。 – JPM

+0

まあ、私はJavaScriptについてよく知らないけど、JavaScriptを使って提案したことをすることはできないのですか?この例のhttp://www.w3schools.com/xsl/xsl_client.aspは、XSLTプロセッサを2回実行するために簡単に変更できるようです。 –

答えて

0

前処理の必要な結果が文字列のリスト(属性値の順序付けられたリスト)ですので、:

は、RTFがツリーフラグメントで、単なる文字列のように扱うという事実を無視します。呼び出されるテンプレートでは、XMLノードを作成せず、value-ofのデリミタを使用して文字列を出力するだけです。

グローバル変数は実際には文字列のリストになります。 (機能substring-before(, delimiter)substring-after(, delimiter)がリストのためのちょっといいポップ機能を形成することができる。)

は、だからではなく、深い前処理(戦略2)内部からの変換を起動する最初の前処理を終え(戦略1)の利点を得ます、大域変数をRTFとしてではなく、文字列の順序付きリストとして考えることでそうすることができます。

+0

これは、ブラウザのクライアント側の変換であるため、node-set()拡張に依存できませんでした。スタイルシートを他の人が使いやすく、適応させ、維持しやすくするために、Javascriptを避けたいと思います。ここでの戦略は軽量で、これまでのところうまく機能しています。 – JPM

1

Doc Brownと同じように、私は目標スタイルシートを生成して実行するという第3の戦略を使用します。 Javascriptを少し使ってブラウザでこれを行うことは可能です。