ブール値を作成するにはどうすればよいですか?


86

私はXSLTにまったく慣れていないので、次のコードでどこが間違っているのか理解できません。

<xsl:variable name="var" select="boolean('false')"/>

<xsl:if test="$var'">variable is true</xsl:if>

falseを意味する場合は、常にtrueを返します。どうして?


3
単なる提案ですが、タイトルを適切な質問として書き、l33tが話さないようにすると、より適切な回答が得られる可能性があります。
ウィルディーン

回答:


168

以下で定義されている$ var変数の値:

   <xsl:variable name="var" select="boolean('false')"/>

です

   true()

これは、XPathでは、値のコンストラクターである、とはfalse対照的にfalse()、" "は通常の文字列であるためbooleanです。false()

XPathの2つのブール値は次のとおりです(構築されていることに注意してください)。

   true() そして false()

任意の値をブール値に変換する詳細は、XPath仕様に詳しく説明されています。

ブール関数は、次のように引数をブールに変換します。

  • 数値が真であるのは、それが正または負のゼロでもNaNでもない場合のみです。

  • ノードセットは、空でない場合にのみtrueになります。

  • 文字列は、その長さがゼロ以外の場合にのみ真になります

  • 4つの基本タイプ以外のタイプのオブジェクトは、そのタイプに依存する方法でブール値に変換されます。

あなたの場合、文字列「false」は数値0ではなく、正の長さであるため、上記の3番目の箇条書きのルールが適用されてtrue()

したがって、値が false()あるXSLT 1.0で変数を定義するには、次のように定義を記述する必要があります。

   <xsl:variable name="vMyVar" select="false()"/>

または、これを正確に覚えていない場合は、いつでも次のように書くことができます。

   <xsl:variable name="vMyVar" select="1 = 0"/>

(に評価される式を指定してくださいfalse())。XSLTプロセッサが自動的に機能します。

XSLT 2.0では、変数のタイプを明示的に指定することをお勧めします

   <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>


@DimitreNovatchevこんにちはDimitre。これは、ブール値がXSL変換ファイルにハードコーディングされている場合の解決策です。文字列の比較を伴わない、変換中のファイルからの文字列に対する適切な解決策はfalseありtrueますか?
ジャガー2015年

1
@ジャガー、これは別の質問です。この質問は「ブール値を作成する方法」を尋ね、その正確な答えを得ています。「特定の文字列をブール値に解釈(または解析)する方法」-これはまったく別の質問です。文字列比較の何が問題になっているのか聞いてもいいですか?
Dimitre Novatchev 2015年

17

使用しているboolean()関数は、実際にその役割を果たしています。明示的なtrue値とfalse値を使用するには、次の関数を使用する必要があります。

<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>

参考までに、MSDNのドキュメントによると、boolean()は次を返します。

  • 引数が負または正の数の場合、ブール値trueに変換されます。
  • 引数がゼロまたはNaN値の場合、falseに変換されます。
  • 引数が空でないノードセットの場合、trueに変換されます。空のノードセットはfalseに変換されます。
  • 引数が空でない文字列の場合、trueに変換されます。空の文字列はfalseに変換されます。
  • 引数が4つの基本型以外の型のオブジェクトである場合、その型に依存する方法でブール値に変換されます。

リストの最後から2番目の項目は重要なものであるため、より目立つように再フォーマットする必要があります。"boolean( '')"もfalseを生成します。
Tomalak 2008

2
@Tomalak、私の答えを見てください。これはもう少し詳細で、本当のソースである「MSDN」ではなくW3C XPathSpecを引用しています。
Dimitre Novatchev

1
@Dimitre:この点でMSDNがW3C仕様から大きく逸脱しているとは思いません。:)しかし、そこを指すことはもちろんもっと正しいです。
Tomalak 2008

5

この段階では少し遅れているかもしれませんが、ブール値を扱うimoは努力する価値がありません。DBから戻ってくるブール値(必須)をどのように処理したかを次に示します。

<xsl:variable name="vTrue" select="true()"/>                     
    <xsl:choose>
      <xsl:when test="string(Mandatory) = string($vTrue)">
        <xsl:text>Mandatory</xsl:text>
      </xsl:when>
      <xsl:otherwise>           
      </xsl:otherwise>
    </xsl:choose>

これが誰かを助けることを願っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.