87

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

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

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

false であることが意図されている場合は、常に true を返します。なんで?

4

3 に答える 3

169

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

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

   true()

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

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

   true()false()

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

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

  • 数値は、正または負のゼロでも 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()"/>

于 2008-12-06T17:20:36.393 に答える
18

使用している 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 つの基本型以外の型のオブジェクトである場合、その型に依存する方法でブール値に変換されます。
于 2008-12-06T12:38:18.490 に答える
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>

これが誰かに役立つことを願っています

于 2011-06-02T09:29:51.443 に答える