2010-11-18 4 views
7

XSLTファイルを作成しています。 私はXMLファイルから値をとる変数を1つ持っています。しかし、xmlに値の参照がなく、その時点でXSL変数がFalse/None(わからない)を返すことがあります。変数に値がない場合は、デフォルト値を使用します。 どうすればいいですか?質問に与えられたいくつかの詳細をXSLTで変数の値がわかるかどうか

+0

[XSLTで変数が存在するかどうかをテストするにはどうすればよいですか?](http://stackoverflow.com/questions/1299808/in-xslt-how-do-you-test-to-see- variable-exist-exists) –

答えて

18

、あなたがすることができる最も簡単なテストでは、次のとおりです。

<xsl:if test="$var"> 
    ... 
</xsl:if> 

それとも、他のケースのための出力を提供したい場合は、xsl:chooseを使用する可能性があります:

<xsl:choose> 
    <xsl:when test="not($var)"> <!-- parameter has not been supplied --> 
</xsl:when> 
    <xsl:otherwise> <!--parameter has been supplied --> </xsl:otherwise> 
</xsl:choose> 

2番目の例では、変数またはパラメータに実際の値が指定されていない、つまり空の文字列と等しいことも正しく処理されます。これはnot('')trueを返すために機能します。

+3

ですが、変数contentの存在をテストする場合は、 'test =" $ var!= " – scunliffe

+1

I second @scunliffe - $ varが存在するが空である場合、 'test =" $ var "'はまだtrueを返します。ただし、以前のバージョンのXSLを使用している場合は、 'test =" not($ var = '') "'と書く必要があります。 –

+0

@scunliffe:空の文字列を扱うための私の拡張答えを見てください。 –

0

XSLTは宣言型パラダイムに属しているため、すべての変数に値があります。つまり、asignation命令はありませんが、変数を宣言すると値の関係式も宣言されます。

この値がノードセットのデータ型(質問から見た場合)の場合は、何も選択されていない場合に空のノードセットをテストする必要があります。空のノードセットの有効なブール値はfalseです。だから、@0xA3test="$node-set"と答えました。

あなたは書きました:

を変数 はデフォルト1を使用するための値がない場合。どうやってするか ?

これは、探しているデータの種類によって異なります。

は、ノードセットのデータ型を仮定します

$node-set-1|$node-set-2[not($node-set-1)] 
+0

@Alejandro:これは良い答えですが、OPは値がノードセットを保持することをどこにも示していません。それはちょうどストリングかもしれません... –

+0

@Dimitre:良い点。私はこのように文章を読んでいます。「XMLファイルから値を取る変数が1つあります。 –

12

あなたの避難所:あなたは$ノードセット-1の値または$ノードセット-2 $ノードセット-1が空の場合は、その後、使用したい場合「価値がない」という意味を説明していません。ここは、一般的な解決策です:

not($v) and not(string($v)) 

この式は、「値がない」$v場合に限っtrue()に評価されます。

両方の条件が'0'のように定義された文字列$v値を有するが、not($v)true()あるため、を満たす必要があります。

"value"がノードセットである場合、または値がスカラー(文字列、数値またはブール値など)である場合、デフォルトを使用するXSLT 1.0ではさまざまな方法で達成できます。

@Alejandroは、ノードセットを含むことになっている変数が空の場合、デフォルト値を取得する一方通行を提供していました。(それ以外)

変数がスカラーを含むようになっている場合は、次の式は、その値を返します(それが値を持っている場合)、または所望のデフォルト:

concat($v, substring($default, 1 div (not($v) and not(string($v))))) 
+0

スカラー値であっても変数はどのように設定できないのですか?パラメータのみを設定することはできません(デフォルトの式なし)。この場合にのみ、パラメータは空の文字列を値として取ります。 –

+0

@Alejandro:[ポイント11](http://www.w3.org/TR/xslt#variables)によれば、変数*は値に束縛されている可能性があります。 select属性または変数バインディング要素の内容によって明示的に指定された値がない場合、[point 11.2]の3番目の箇条書き(http://www.w3.org/TR/xslt#variable-values)がバインディングを適用します変数を空の文字列に変換します。 –

+1

@ 0xA3:いいえ、変数バインディング要素は3つの代替方法で変数の値を指定できます.3番目の方法は '可変バインディング要素は空の内容を持ち、select属性を持たず、変数の値は空の文字列 'です。したがって、それは明確な価値を持っています。価値のないものはありません。 –

0

私はたくさんのを試してみましたSOからの解決策、私の最後の解決策は@ dimitre-novatchevから取られましたが、それも毎回働いていません。最近私は、ランダムなGoogle検索からもう1つのソリューションを見つけました。コミュニティと共有すると考えました。

空の変数値をチェックするために、空の変数を宣言し、その値をテスト条件と比較することができます。ここでは、コードスニペットは次のとおりです。ここで

<xsl:variable name="empty_string"/> 
<xsl:if test="testVariableValue != $empty_string"> 
... 
</xsl:if> 

空 シナリオを試験する新しい変数の値を保持testVariableValue。 空の変数状態をテストすることをお勧めします。

0

たとえば、$referenceという名前の変数に何かが含まれているかどうかを確認するには、string-lengthを使用できます。

<xsl:choose> 

    <xsl:when test="string-length($reference) > 0"> 
    <xsl:value-of select="$reference" /> 
    </xsl:when> 

    <xsl:otherwise> 
    <xsl:text>some default value</xsl:text> 
    </xsl:otherwise> 

</xsl:choose> 

normalize-spaceも必要に応じて使用してください。

関連する問題