2011-06-29 192 views
2

是什麼<xsl:variable name="test" select="1"/>XSLT = 「1」 之間或選擇選擇選擇= 「 '1'」

<xsl:variable name="test" select="'1'"/>之間的區別?

如果兩個結果都是結果tre片段,那麼基本上上面兩行代碼是相同的?

如果是這樣。我們如何決定使用哪一個?

回答

2

第一個示例創建一個數字值爲1的類型編號變量,第二個字符串值爲「1」的字符串類型變量。結果樹片段不是用您的代碼示例創建的,可以使用<xsl:variable name="test">1</xsl:variable>完成。

2

正如@馬丁指出的,第一個將變量綁定到一個數字,第二個綁定到一個字符串。

我們該如何決定使用哪一個?

覺得用你將與該變量做的。例如,在第一種情況下,你將能夠做到:

item[$test] 

這將是不可能在第二種情況下,除非你使用number()功能。

根據以下注釋,使用任何比較運算符時,字符串或數字不會有任何區別。即使在與節點集或rtfs進行比較時也是如此。你可以閱讀規範(有點詳細)或嘗試一些愚蠢的測試。

在處理節點位置時,您可以獲得的不同行爲仍然很明顯。例如,如果您有:

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

,你有這樣的輸入:

<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: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將數字和字符串視爲幾乎可以互換,只有極少數例外。一個值得注意的例外是項目[$ test]。但是「=」的行爲也略有不同:因爲數字4和04是相等的,但是它們不是。

在XPath 2.0和XSLT 2中。0類型系統更加豐富,字符串和數字之間的差異更加明顯:在數字上定義的許多操作對字符串不起作用,反之亦然。

如何決定?如果它是全數字的,你通常會想要使用一個數字,除非它像電話號碼那樣,前導零很重要,因此它不是一個真正的數字,而是一串數字。