web-dev-qa-db-ja.com

ブール値を作成する方法は?

私はXSLTを初めて使用しますが、次のコードのどこがおかしいのかわかりません。

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

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

Falseの場合、常にtrueを返します。どうして?

82
sydlawrence

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

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

true()

これは、XPathでは「false」が通常の文字列であり、false()booleanfalse()のコンストラクターであるためです。

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

true()およびfalse()

値をブール値に変換する詳細は、 XPath Spec .:に記述されています。

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

  • 正または負のゼロでもNaNでもない場合にのみ、数値はtrue

  • ノードセットは、空でない場合にのみ真です

  • 文字列は、その長さがゼロでない場合にのみ真です

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

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

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

<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()"/>

164

あなたが使用している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つの基本型以外の型のオブジェクトである場合、その型に依存する方法でブール値に変換されます。
17
Yuval Adam

この段階では少し遅れているかもしれませんが、ブール値を扱うことは努力するだけの価値はありません。 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>

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

5
outofcoolnames