2012-01-13 7 views
1

私はテンプレートを "拡張する"テンプレートを書いていますが、いくつか問題があります。これですべてのパラメータを渡すすべてのXSLテンプレートをキャッチする方法は?

<xsl:template match="*[@condition]" mode="#all"> 
<xsl:element name="condition"> 
    <xsl:attribute name="name"> 
    <xsl:value-of select="@condition"></xsl:value-of> 
    </xsl:attribute> 
    <xsl:apply-imports> 
    </xsl:apply-imports> 
</xsl:element> 

問題が<xsl:apply-imports>欠けているのparamsを使用して呼び出されたテンプレートです。 このテンプレートが拡張しようとするテンプレートがたくさんあるので、パラメータのリストはわかりません(したがって、mode="#all")。

良い方法がありますか?


追加例:可能性があります

<xsl:apply-templates mode="mode1"> 
    <xsl:with-param name="mode1" select="$mode1"/> 
</xsl:apply-templates> 

<xsl:apply-templates mode="mode2"> 
    <xsl:with-param name="mode2" select="$mode2"/> 
</xsl:apply-templates> 

あり:

<xsl:template match="*" mode="mode1"> 
    <param name="p1"/> 
</xsl:template> 

<xsl:template match="*" mode="mode2"> 
    <param name="p2"/> 
</xsl:template> 

彼らはどこかに呼ばれている(読み取り専用):

は、2つの最終テンプレート(読み取り専用)考えてみましょうmode1、mode2、mode3、mode4 ...の100であり、名前にはパターンがありません。

最後のテンプレートの周りに追加情報をラップするグローバルテンプレートが必要です。何かが好きです:

<xsl:template match="*" mode="#all"> 
    <xsl:next-match/> 
</xsl:element> 

上記のグローバルテンプレートは、テンプレートにパラメータを渡しません。

答えて

1

<xsl:apply-imports>を呼び出すときに、現在のテンプレートに渡されるパラメータが含まれていない場合、トンネルパラメータを使用できます。

<xsl:with-param name="foo" tunnel="yes"/> 

私も<xsl:next-match>代わりの<xsl:apply-imports>を使用することをお勧め:

<xsl:param name="foo" tunnel="yes"/> 

あなたはパラメータを渡すとき、また:テンプレートでは、このようなあなたのパラメータは、マークを拡張しています。

+0

ありがとう:このよう

何か。これは部分的に問題です。別の問題もあります。名前も "foo"で知られておらず、さまざまなパラメータを取るさまざまなテンプレートがあります。すべてのテンプレートを見つけて、そこにあるすべてのパラメータを一覧表示することはできません。 – Jason

+0

@ Jason:すべてのテンプレートでトンネルパラメータを宣言する必要はありません。 –

+0

もう少し完全な例を追加しました。これが私が探しているものを示してくれることを願っています。キーはテンプレートが読み取り専用で、呼び出し元ファイルも読み取り専用です。私は何とかテンプレートを拡張することしかできません。 – Jason

1

Max Toroが提案するようにトンネルパラメータを使用することも、単一のパラメータを渡すこともできます。その子は、さまざまなテンプレートで必要と認識されるパラメータです。答えを

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pComposite" as="element()*"> 
    <param for="templateX" name="pA"> 
    12 
    </param> 
    <param for="templateY" name="pB"> 
    Some String 
    </param> 
</xsl:param> 

<xsl:template match="*[@condition]"> 
    <condition name="{@condition}"> 
    <xsl:apply-imports> 
    <xsl:with-param name="pComposite" 
     select="$pComposite"/> 
    </xsl:apply-imports> 
    </condition> 
</xsl:template> 
</xsl:stylesheet> 
+0

答えDimitreありがとう。それは役に立ちます。多くのパラメータを持つテンプレートがたくさんある場合は、pCompositeパラメータですべてを反復処理する必要がありますか?私はparamsが他のテンプレートにもっと透過的な方法で渡されることを望んでいました。 - Jason – Jason

+0

@ Jason:繰り返しは必要ありません。すべてのテンプレートは、 '$ pComposite/myName'のようなXPath式でパラメータを取得します。これは便利で便利です。 –

+0

この場合、他のすべてのテンプレートを変更し、新しいパラメータpCompositeを導入する必要がありますか? – Jason

関連する問題