2011-11-10 27 views
0

xsl:templatesおよびxsl:call-templateタグに問題があります。おそらくそれは理解の欠如ですが、ここで私がしようとしていることは...xsltを使用してxsltをcsvファイルに変換する

「/ *」に一致するテンプレートがあり、必要な囲みテンプレート内から他のテンプレートを呼び出す必要がある他のドキュメントのコンテキスト、これを行う最も効率的な方法は何ですか?

<xsl:template match="/*"> 

<xsl:call-template name="header"> 
    <xsl:with-param name="headerContext" select="./[1]"/> 
</xsl:call-template> 

<xsl:call-template name="body"> 
    <xsl:with-param name="bodyContext" select="*/*/[1]"/> 
</xsl:call-template> 

<xsl:template> 

私はXSL使用しています:私は、囲むテンプレートから=「/ *」のマッチを上書きすることができるようにヘッダとボディのテンプレートを呼び出すときと-PARAMを、私はこれを行うとき、出力がめちゃくちゃます。上記の例のように、メインテンプレートから両方を呼び出すと、 "ヘッダー"テンプレートの呼び出しをコメントアウトすると、本体テンプレートが正しく動作し、逆も同様です。ヘッダーテンプレートとボディテンプレートはドキュメントのさまざまな部分を選択する必要があります。そのためw0th-paramを使用することにしましたが、それは機能しているとは思われません。

代わりにapply-templatesを使用する必要がありますか?

+0

「彼らはどんなやり方で奇妙に振る舞うのですか?また、選択式には、最終的なロケーションステップでノードテストがありません。 –

+0

この情報から問題を診断することはできません。しかし、はい、あなたはこの種のもののためにapply-templatesを使う方が良いでしょう。 –

答えて

0

XSLはイベントベースに設計されています。したがって、通常、処理する子孫を明示的に指定するよりも、テンプレートマッチングを使用するほうがよいでしょう。

<!-- Identity Template will copy every node to the output. --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- You listed ./[1] as your xpath, but you might want to add more information 
    to make it more specific. i.e. element names, not just * and position. --> 
<xsl:template match="/*/header"> 
    <someOutputHeader><xsl:apply-templates /></someOutputHeader> 
</xsl:template> 

<xsl:template match="/something/*/body"> 
    <newBody><xsl:apply-templates /></newBody> 
</xsl:template> 

また、述語の前にnodeTestを指定することをお勧めします。たとえば、 "./[1]"を書く代わりにスラッシュの後に*を指定することができます。 "./* [1]" "./"を使う必要もありません。それはxpathによって暗示されます。だから実際には、「* [1]」

関連する問題