2016-06-22 24 views
1

一度初期化されたXSLT変数は、それぞれの値を変更できないことがわかります。この出力で同じスコープ内で同じ名前の複数のXSLT変数を宣言する

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:variable name="myVar" select="'asdex upgrade'" /> 
     <xsl:value-of select="$myVar" /><xsl:text>&#xA;</xsl:text> 
     <xsl:variable name="myVar" select="'Wendelstein'" /> 
     <xsl:value-of select="$myVar" /><xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 


サクソン-PE 9.2.0.6は、次の構文を使用できます

asdex upgrade 
Wendelstein 

ので、ここで何が起こっていますか?明らかに、このコードは、変数がXSLTに不変であるという事実と矛盾していません。そうでなければ、Saxonプロセッサはそれを処理しません。私はここで同じ名前の2つの変数を作成していますか?もしそうなら、第2の変数が作成された後に最初の変数にアクセスする手段を持っているか、存在しなくなったのか、それともXSLTプロセッサのシンボルテーブルに隠れているのでしょうか?それとも何を与える?

ありがとうございました!

答えて

2

が詳細にhttps://www.w3.org/TR/xslt20/#scope-of-variablesを見る、それは任意の可変結合素子について

を説明し、結合が見える その内部スタイルシートの領域(要素ノードの集合、具体 より)があります。 XPath式のスコープ内の変数バインディングのセットは、式が出現するスタイルシートの ポイントに表示されるバインディングから構成されます。

ローカル変数結合要素は、2つの例外を除いて、すべての次の兄弟 およびそれらの子孫のために表示されている:それは、それが結合する別の変数により隠されている任意 領域に表示されません、 はxsl:fallback命令を基にしたサブツリー内に表示されず、 は変数バインディング要素の兄弟です。 xsl:variableまたはxsl:param要素自体のバインディングは ではありません。

[定義:バインディングが発生した場合、バインディングは他のバインディングが表示されているポイントで が発生した場合にシャドウし、バインディングには同じ名前の があります。 ] ローカルxsl:variableまたはxsl:paramによって確立されたバインディングがグローバルバインドをシャドウする場合は、エラーではありません。この の場合、グローバルバインディングは、他のバインディングによってシャドウされている スタイルシートの領域には表示されません。

したがって、2番目のxsl:variable name="myVar"は最初のものをシャドウします。

+0

ああ、ありがとう。この仕様書はそれをはっきりと述べています。リンクをありがとう、私は明らかにそこにいくつかの読書を行う必要があります。 – rexford

関連する問題