4

xsl:variable空の文字列または数値のいずれかになります。だから私はそれを次のように評価します:

<xsl:if test="number($var)"><node att="{number($var)}" /></xsl:if>

これvarは が空の文字列の場合に機能しますが、 is の場合も同じ効果がvarあり0ます:

-2 から 2:

<node att="-2" />
<node att="-1" />
<node att="1" />
<node att="2" />

これはバグですか?numberもキャプチャする関数の別のバージョンはあり0ますか? 私は本当にor $var = '0'自分のtest声明に追加する必要がありますか?

4

3 に答える 3

5

これは、 XPath 仕様に完全に準拠しています。

定義上boolean(0)false()

あなたがしたい

<xsl:if test="number($var) = number($var)">
  <node att="{number($var)}" />
</xsl:if>

説明:

number($x) = number($x)

が数値にキャストできるのはtrue()正確です。$x

が数値にキャストできない場合$x、上記の比較の両側は に評価されNaN、定義によりNaN、 を含むどの値とも等しくありませんNaN

:

$varintegerかどうかを確認する場合は、次を使用します。

<xsl:if test="floor($var) = $var">
  <node att="{$var}" />
</xsl:if>

または、代わりに:

<xsl:if test="not(translate($var, '0123456789', ''))">
  <node att="{$var}" />
</xsl:if>
于 2012-04-28T22:33:32.417 に答える
2

ノード値がnumberの場合、XPathテストから取得されます。NaN
に対して値をテストします。

<xsl:if test="string(number(myNode)) != 'NaN'">
    <!-- myNode is a number -->
</xsl:if>

これは短いバージョンです:

<xsl:if test="number(myNode) = myNode">
    <!-- myNode is a number -->
</xsl:if>


<xsl:if test="number(0)">

式number(0)はブール値false()に評価されます-定義上

boolean(0)はfalse()です

于 2012-04-28T21:49:38.070 に答える
1

XPath 2.0では、$var castable as xs:integerまたはなどの式を使用してみてください$var castable as xs:double

于 2012-04-29T07:48:00.907 に答える