2011-01-24 17 views
0

これは初心者の質問です。異なるXSLTテンプレート間の変数参照に関するものです。連鎖したXSLTの変数参照に関する質問

私は最初にXSLTファイルを持っており、その中にテンプレートAを宣言しました。その中に基本的にXMLファイルの各レコード(行)をループします。たとえば、xml_A私はxml_Aの現在のレコードの "id"という特定のフィールドを参照する変数を宣言しました。その後、このため、各ループ内で、私はテンプレートBの場合は、別のテンプレートB.に

<xsl:template name="A"> 
<LoopA> 
    <xsl:for-each select="$xml_A//xml_A_row"> 
    <xsl:variable name="id_A" select="id"/> 
    .... 
</LoopA> 
<xsl:call-template name="B"/> 
</xsl:template> 

を呼び出す必要があり、私は実際には同じディレクトリの下に別のXSLTファイルを作成しました。

<xsl:template name="B"> 
<LoopB> 
<xsl:variable name="id_A" select="id"/> 
... 
</loopB> 
</xsl:template>  

ここに私が来る:私はそれをやった方法ですBは、XMLファイルからのレコードの数百万人「xml_B」が含まれていますが、私はここで、テンプレートAの現在のレコードと同じIDのフィールドを持つレコードをしたいです質問。上記の<xsl:variable name="id_A" select="id"/>を使用して、上部ループがオンになっている現在のレコードのidフィールドを参照しています。しかし、データファイルが非常に大きいので、これが正しいかどうかわからないので、いくつかのテストを行いました。したがって、これが正しいことをしているかどうかを視覚的にテストすることは容易ではありません。

外部ループの変数への上記の参照が正しいかどうか誰かが助言できるかどうか疑問に思います。なぜなら、私がそれを削除すると、XMLエディタが文句を言うからです。

ありがとうございます。私は十分にそれを明確にしなかったと思うコメント

から

を更新。 実際にはxml_Aまたはxml_Bのいずれも、XSLTされるxmlファイルの です。 これらはデータファイルであり、データを取り出すために を使用します。 の場合は が空の別のXMLファイルCが使用されています。だから私のスタイルシートでは、 の回答を使用して、私は への道を持っている必要があります ファイルxml_Aを参照してください。

+0

質問が不明です。スタイルシートフラグメントに 'loopA'と' loopB'要素が何をしていますか? –

+0

@Aljandro:LoopAとLoopBは、出力XMLに表示される単なるタグです。 – Kevin

+0

'LoopA'と' LoopB'が*リテラルの結果要素*である場合、内容として機能的な 'xsl:template'要素を持つことはできません。完全なスタイルシートを表示してください。 –

答えて

4

典型的なXSLTスタイルは次のようになります。

<xsl:variable name="xml_B" select="document('xml_B.xml')"> 

<xsl:template match="xml_A_row"> 
    <xsl:apply-templates select="$xml_B/path/to/xml_B_row[id = current()/id]"/> 
</xsl:template> 

:パターンがxsl:apply-templates代わりxsl:call-templateで、current()機能は、コンテキストノードを参照するために、代わりにxsl:for-eachと名前付きテンプレートのマッチング。

EDIT:...もっと自分の不完全なスタイルシートフラグメントのような

<xsl:key name="kBRowById" match="xml_B_row" use="id"/> 

<xsl:variable name="xml_A" select="document('xml_A.xml')"/> 
<xsl:variable name="xml_B" select="document('xml_B.xml')"/> 

<xsl:template name="A"> 
    <LoopA> 
     <xsl:for-each select="$xml_B"> 
      <xsl:apply-templates select="key('kBRowById',$xml_A//xml_A_row/id)" 
           mode="just-in-case"/> 
     </xsl:for-each> 
    </LoopA> 
</xsl:template> 

<xsl:template match="xml_B_row" mode="just-in-case"> 
    <LoopB/> 
</xsl:template> 

見るために:xsl:keyを使用しますが、順番にシングルトンルートノードでxsl:for-each、「レコードのmillons」を書いたので、外部参照スコープ変数$xml_Aを相互参照キー値として使用して、fn:key()関数のコンテキストノードを変更します。 modeは、あなたが提供していないスタイルシートの他のルールと衝突する場合があります。

+1

+1すべての最善の答えには添付の説明があります:) –

+0

@Nic Gibson:良い点!私はOPが要求しているものである場合の説明を拡張するつもりです... –

+0

@Alejandro:テンプレートAまたはBに入れるコードですか? – Kevin

関連する問題