0

次のようなxsltスタイルシートがあるとしましょう。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exslt="http://exslt.org/common"
    exclude-result-prefixes="exslt"
    version="1.0">

<xsl:output method="html" encoding="utf-8" indent="no" />
<xsl:variable name="foo" value="'foo'" />
<xsl:variable name="bar" value="'bar'" />

</xsl:stylesheet>

ここでの実行順序は何ですか?グローバル変数$fooがグローバル変数$barの前に評価されることが保証されていますか?(処理エンジンに依存している場合は、libxsltを使用しています)。

4

4 に答える 4

4

評価の順序は、一般に、そのような保証が式の依存関係に続く場合を除いて、保証されません。例えば:

<xsl:variable name="foo" value="123" />

<xsl:variable name="bar" value="456" />

<xsl:variable name="baz" value="$foo + $bar" />

<xsl:variable name="dummy" value="42 div 0" />

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

ここで、baz出力される前のある時点で評価されることは確かです-おそらく出力の直前、おそらく起動時、おそらくその間のどこかで-そしてその前に評価されますfoo-しかし、との相対的な評価順序は定義されていません。barbazfoobar

dummy興味深いケースです。実際にはどこにも使用されていないので、完全に省略できますが、仕様の理解が正しければ、プロセッサは評価されたかのようにエラーを発生させる必要があります。XSLTの内部から判断する方法がないため、この時点では重要ではありません。dummy実行中の不特定の時点で評価されます(最初に実行される場合もあれば、すべての出力が既に生成された後の最後の場合もあります)。ただし、変換がエラーで失敗することが保証されています。

これはすべてXSLTとXPath1.0に関するものです。2.0では、よりリラックスしています。評価を行う必要すらありません。プロセッサが一部の式の評価をスキップして有効な結果を取得でき、そうでない場合はエラーが発生する場合は、それを行うための包括的な権限があります。

于 2009-09-02T03:26:19.370 に答える
0

テンプレート内では、変数定義は上から下の順序で実行されます(fooその後bar

編集[誤ったステートメントが削除されました]:Pavelがここで説明しているように、この場合、XSLTには、変数の評価方法を規定する明確に定義された動作があります。特に、次のテストケースは、あなたが求めている動作を示しています。

良いテストケースは、一方の変数をもう一方の変数に依存させることかもしれません...例:

<xsl:variable name="foo" select="'foo'" />
<xsl:variable name="bar" select="$foo" />

次に、変数を画面に出力します。

順序を逆にすることもできます(例)

<xsl:variable name="bar" select="$foo" />
<xsl:variable name="foo" select="'foo'" />

それが価値があることについては、私はあなたがあなたの投稿のselectどこに書いたかを意味すると思います。value

編集1:XSLTの変数は不変であり、関数の実行には副作用がないため、順序は実際には重要ではありません。特に、順序が重要な場合に発生する可能性がある唯一の条件は、ある変数が別の変数の値に依存する私の単純な図(確実にテストとして実行する必要があります)の条件です。

編集2:「コード」の例で間抜けを修正

于 2009-09-02T02:11:35.223 に答える
0

私の経験から、変数はテンプレートが実行されるときに常に利用可能です。実際、私はテンプレート外の変数に基づいてテンプレートを処理しました。

于 2009-09-02T02:02:12.210 に答える
-1

私はこの問題についてajitomatixを使用していますが、実際の問題は次のとおりです。初期化後、テンプレートの外部にこれらの変数宣言が多数あります。

<xsl:variable name="ignore" select="fun_init(args)" />
<xsl:variable name="foo1" select="fun('foo1')" />
<xsl:variable name="foo2" select="fun('foo2')" />
<xsl:variable name="foo3" select="fun('foo3')" />
...

関数fun()は、init関数が以前に呼び出されたことを確認した場合にのみ正しい結果を返します。しかし、gdbのブレークポイントを介して、順序がほぼランダムであることがわかりました。

于 2009-09-02T03:39:13.480 に答える