XPathを使用してノード値が数値であるかどうかを確認するにはどうすればよいですか?
何か案は?
回答:
NaNに対して値をテストします。
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
これは短いバージョンです(@Alejandroに感謝):
<xsl:if test="number(myNode) = myNode">
<!-- myNode is a number -->
</xsl:if>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
)の型の不一致により、@ Alejandroによる短いバージョンはXPath 2.0で完全に失敗しますが、Dimitre のソリューションは正常に機能します。
変数に含まれている値を数値$v
として使用できるかどうかをテストする最も簡単な方法は次のとおりです。
number($v) = number($v)
$v
上記の値を、テストする値を持つ式に置き換えるだけです。
説明:
number($v) = number($v)
が$v
数値、または数値を表す文字列の場合は、明らかにtrue です。
a number(true())
は1でnumber(false)
あり、0 であるため、ブール値にも当てはまります。
$v
数値として使用できない場合はいつでも、number($v)
NaN
NaNは、それ自体であっても、他の値とは等しくありません。
したがって、上記の式は$v
、値を数値として使用できる場合にのみtrue になり、それ以外の場合はfalseになります。
number($v) = number($v)
が別の結果をもたらす場合についてコメントできますかnumber($v) = $v
?
number($v) = number($v)
が別の結果を生み出すケースをリストアップできるnumber($v) = $v
だろうか?間違いなく、それはあなたが書いたものから導き出せるものですが、私がこの質問に明示的に対処した場所はわかりません。私が密集している場合は申し訳ありません。IOW、あなたのソリューションと@ Oded's / @ Alejandroのソリューションは常に同じ結果をもたらしますか?
私はさらに別の代替ソリューションを提供しようとしているのではなく、この問題の「メタビュー」を提供しています。
OdedとDimitre Novatchevによってすでに提供されている答えは正しいですが、「値は数値」というフレーズで実際に人々が意味する可能性があるのは、どのように言うか、解釈に対してオープンです。
ある意味で、それはすべてこの奇妙に聞こえる質問になります: 「数値をどのように表現したいですか?」
XPath関数number()
は、
これには、以下の数値の式は含まれません。
これらは単なる基準ではありません。スキーマに従って有効なxs:float
値の内容を持つ要素には、上記の特性のいずれかが含まれる場合があります。まだnumber()
値を返しますNaN
。
それで、「ノード値が数値である場合、XPathで確認するにはどうすればよいですか?」という質問に答えてください。「を使用してすでに説明したソリューションを使用するnumber()
」または「単一のXPath 1.0式では使用できない」のいずれかです。発生する可能性のある可能性のある数値形式について考え、必要に応じて、検証/数値解析のためのある種のロジックを記述します。XSLT処理内では、これは、たとえばいくつかの適切な追加テンプレートを使用して実行できます。
PS。ゼロ以外の数値のみを考慮する場合、最短のテストは
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
:少なくとも一つの引数が数値データが入力された場合に数データ型の値は、任意の数の値との比較のために等しくない、他の数にキャストされ、これは最短番号試験であるnumber(MyNode)=MyNode