0

xsl:templates および xsl:call-template タグに問題があります。理解不足かもしれませんが、私がやろうとしていることは次のとおりです...

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

<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:with-param を使用して、囲んでいるテンプレートから match="/*" をオーバーライドできるようにしていますが、これを行うと出力がめちゃくちゃになります。「ヘッダー」テンプレートへの呼び出しをコメント アウトすると、本文テンプレートは適切に機能し、その逆も同様ですが、上記の例でわかるように、メイン テンプレートから両方を呼び出すと、それらの動作が奇妙になります。ヘッダーと本文のテンプレートでは、ドキュメントのさまざまな部分を選択する必要があります。そのため、w0th-param を使用することにしましたが、機能しているとは思いません。

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

4

1 に答える 1

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]」です。

于 2011-11-10T04:23:40.643 に答える