2011-06-29 12 views
2

<xsl:variable name="test" select="1"/>XSLT =選択

<xsl:variable name="test" select="'1'"/>の違いは何ですか?

結果が両方とも結果の断片であれば..基本的に上記2行のコードは同じですか?

もしそうなら、どのように使用するかを決めるにはどうすればよいですか?

答えて

2

最初のサンプルでは、​​数値が1の変数を作成し、2番目の変数は文字列値が「1」の文字列型の変数を作成します。結果ツリーフラグメントはコードサンプルでは作成されません。これは<xsl:variable name="test">1</xsl:variable>で行われます。

2

@Martinが指摘したように、最初の変数は変数を数値にバインドし、2番目の変数は文字列にバインドします。

どのように使用するのですか?あなたがその変数で行います使用の

と思います。たとえば、あなたが行うことができるようになります最初のケースでは:あなたがnumber()機能を使用しない限り

item[$test] 

これは、後者の場合にはできません。

以下のコメントに従って、文字列または数値は、比較演算子のいずれかを使用しても差異がありません。ノードセットやrtfsと比較しても。これをスペック(少し冗長)で読んだり、愚かなテストを試したりすることができます。

ノードの位置を扱うときに得られるさまざまな動作は、依然として明白です。たとえば、あなたが持っている場合:

<root> 
    <test>a</test> 
    <test>b</test> 
</root> 

使用することにより:

<xsl:value-of select="/root/test[$rtf2]"/> 
    <xsl:value-of select="/root/test[$string2]"/> 
    <xsl:value-of select="/root/test[$number2]"/> 

はあなたが取得します:

aab 

<xsl:variable name="number2" select="2"/> 
<xsl:variable name="string2" select="'2'"/> 
<xsl:variable name="rtf2">2</xsl:variable> 

、あなたがこのような入力を持っていますこれは、

<xsl:value-of select="/root/test[position()=$rtf2]"/> 
    <xsl:value-of select="/root/test[position()=$string2]"/> 
    <xsl:value-of select="/root/test[$number2]"/> 

返します。

bbb 

による比較演算子によって引き起こされる暗黙の変換に。

+1

XSLT 1.0では、比較演算子 '> 'がオペランドを数値に変換するので、どちらの場合でも' nodeset> $ test'を実行できます。 –

+0

真。それを反映して更新されました。スペックとの違いを把握するのは難しいです。 –

1

XPath 1.0とXSLT 1.0は、数字と文字列をかなり互換性があり、ほとんど例外なく扱います。注目すべき例外はitem [$ test]です。しかし、 "="はやや異なった動作をします:数字4と数字04は同じですが、文字列としては違います。

XPath 2.0およびXSLT 2では、0型システムははるかに豊富であり、文字列と数値の違いははるかに目立つ。数字で定義された多くの演算は文字列では機能しないし、逆もまた同様である。

どのように決定するのですか?それがすべて数字である場合は、電話番号のようなものでない限り、通常は数字を使用することになります。先行ゼロが重要なので、実際に数字ではなく文字列です。

関連する問題