3

私は XSLT の初心者で、この問題にかなり苦労しています。XSLT で while のようなループを実行する必要があります。この問題を解決するには for-each だけでは不十分だと思います。

SELECT ステートメントの結果である変数があります。0 または整数を返すことができます。値が 0 の場合は、別のパラメーターを送信して SELECT を再度実行し、値が異なるかどうかを確認する必要があります。

while のようなループを使用することしか考えられませんが、これを達成する別の方法があるのではないでしょうか? テンプレートを使用して、最後に自分自身を呼び出すのは好きですか? 出来ますか?

そんな感じ:

<!-- initiate TEMPLATE -->
<!-- WHILE $VALUE = 0 -->
<xsl:variable name="sql.query">
    <sql:param name="SQL_QUERY">SELECT $value FROM date_table WHERE date='$date'</mx:param>
</xsl:variable>

<xsl:variable name="VALUE">
    <xsl:value-of select="sql:exec-formula('generic.sql', exsl:node-set($sql.query)//sql:param)" /> <!-- this will bring the result of the SELECT in the variable -->
</xsl:variable>

<xsl:variable name="date">
    <xsl:value-of select="$date-1" /> <!-- something like that, it doesn't matter -->
</xsl:variable>

<xsl:if test="$VALUE ='0'">
    <!-- call template again -->
</xsl:if>
<!-- end of template -->
4

2 に答える 2

16
<!-- recursive named template -->
<xsl:template name="while">

 <xsl:variable name="VALUE">
 <!-- your evaluation -->
 </xsl:variable>

 <!-- evaluate and recurse -->
 <xsl:if test="$VALUE=0">
    <xsl:call-template name="while"/>
 </xsl:if>

</xsl:template>
于 2012-06-20T20:41:04.700 に答える
5

テンプレートを使用して、最終的に自分自身を呼び出すのが好きですか?

正解:empoで示されているように、この問題の通常の解決策は末尾再帰です。より優れたXSLTプロセッサは末尾再帰を最適化するため、スタックを消費しません。最悪のものは、500回ほどの反復後にスタックスペースを使い果たします。その場合、別の解決策を探す必要があります。

注:この種の構成は避けてください

<xsl:variable name="date">
    <xsl:value-of select="$date - 1" /> 
</xsl:variable>

あなたができるとき

<xsl:variable name="date" select="$date - 1" /> 

これは不必要に冗長であり、変数値が単純な文字列や数値ではなくツリーであるため、非常に非効率的である可能性もあります。

于 2012-06-20T21:28:08.453 に答える