2011-03-30 29 views
2

我使用xslt1.0進行html到xml的轉換。查找真實和小數

<xsl:variable name="margin">0</xsl:variable> 

<xsl:if test="number($margin)"> 
<xsl:message>Its number</xsl:message> 
</xsl:if> 

這是滿足條件並顯示message.If變量保證金的值是0.5,則條件爲假我的模板。

如何編寫與小數點匹配的條件?

+0

好問題,+1。請參閱我的答案以獲得解釋和簡單而簡短的解決方案。 :) – 2011-03-30 05:13:07

回答

2
 <xsl:template match="/"> 
     <xsl:variable name="margin">0</xsl:variable> 

     <xsl:if test="number($margin)"> 
     <xsl:message>Its number</xsl:message> 
     </xsl:if> </xsl:template> 

This is my template which satisfying the condition and displaying message. 
If the variable margin's value is 0.5, then the condition becomes false. 

這根本不是真的。使用9種不同的xslt處理器(包括XSLT 1.0和2.0)進行測試,上面的代碼不會產生任何消息。另一方面,任何不同於0的數字值都會產生消息。

說明

由於事實number(0)0,並且boolean(0)false(),測試不會成功。

使用該XPath表達式:

number($x) = number($x) 

該表達式評估爲true()什麼時候$x是一個數字,那麼它等價於:

$x = $x 

$x不是一個數字,上面的XPath表達式評估爲false()因爲它等同於:

NaN = NaN 

和由定義NaN不等於任何其它值,包括NaN本身。

0

我試過你的代碼(使用MSXSL.EXE,它需要消息中的terminate =「yes」才能看到它的輸出),並且發現,正如我預期的那樣,情況正好相反。當$ margin爲零時,「if」不會發生,但如果它不爲零(例如0.5),則執行「if」。這是因爲測試表達式的計算方式與「boolean()」函數的語義相同,該函數將數字值零解釋爲false,並將任何非零數值解釋爲true。

+0

但條件成爲整數,但不適用於小數。函數number()將小數視爲非整數。其他函數允許整數和小數? – vignesh 2011-03-30 05:09:13

+0

@vignesh:正如我所說的,我嘗試了你的代碼,它和你所描述的完全相反。也許你的XSLT處理器的行爲不同,但如果是這樣,我會把它稱爲一個錯誤。如果您查看XPath標準 - http://www.w3.org/TR/xpath/#section-Number-Functions - 您會看到數字函數在傳遞數字時不執行轉換。這個數字是否是整數並不重要。 – Jollymorphic 2011-03-30 07:26:27

+0

@vignesh:「函數number()將小數視爲非整數。」什麼給你這個想法?這是完全錯誤的。你有沒有讀過迴應? – 2011-03-30 07:39:24