1

したがって、スコープ外の変数にアクセスできないこと、変数が不変であること、XSLTが機能的であり、必須ではないことなどを知っています。

しかし、グローバルな可変変数では些細なことになるような汎用的なアプローチが必要です(それを言うだけで悪に聞こえます:)。ここに例があります...

<xsl:template match="t1">
  <xsl:if test="someLogic">
    <!-- I know, can't do this but just to explain... -->
    <xsl:variable name="varName">numberOrText, maybe even some arithmetic like $varName+1</xsl:variable>
  </xsl:if>
</xsl:template>

<xsl:template match="t2">
  <xsl:value-of select="$varName"/>
</xsl:template>

また、処理中にいつでもt1やt2などのテンプレートがいくつでも存在する可能性があり、変数を変更して使用するテンプレートが存在する可能性があります。

問題の一部は、値が処理の順序に依存することですが、それは意図的なものであり、それが必要なことです。

私が考えた1つの可能性は、値をパラメーターとしてどこにでも渡すことでした。しかし、問題は、1つのリーフテンプレートでそれを変更する必要があり、その後処理が元に戻ることです...その変更は失われます。テンプレートがパラメータを返す方法がない限り、返されたパラメータを渡すことができますか?汎用の純粋な関数型プログラミング言語を考えると、これを行う方法のようです。再帰的に呼び出しますが、値を「繰り越す」ことができるように、戻り値をさらに呼び出すために使用します。

私はこれが拡張機能を使用して行われるのを見てきました-Javaメソッドなどを呼び出すと、グローバルな可変値を持つことができますが...私は実際にはそのような「チート」をしたくありません。

どんなポインタ、アイデアなども歓迎します。

4

1 に答える 1

0

答えは私の質問や他のコメントに含まれていたと思います。ここにそのいくつかを引用します:

「テンプレートがパラメータを返し、それらの返されたパラメータを渡すことができる方法はありますか?汎用の純粋な関数型プログラミング言語を考えると、これを行う方法のようです。再帰的に呼び出しますが、戻り値を使用してさらに値を「繰り越す」ことができるように呼び出します。

user357812から:「これは、最もきめの細かいツリートラバーサルパターンとトンネルパラメータで実行できると思います。入力と出力でのみ、正確な方法を言うことができます。」

于 2011-10-24T17:41:32.590 に答える