2010-10-11 86 views
0

我遇到了$ current變量的值爲'6E144270003'的問題。我最初的目標是測試一個數字,但'6E144270003'通過了number()測試,因爲它是一個有效的'科學記數法'(正如我在這裏指出的那樣)。XSLT編號測試

我需要一個有效的測試,以允許數據只包含整數(可以包含十進制和負號)等於真和任何其他數據等於假。

應該通過:1234567890
應該通過:123.45
應該通過:123.5
應該通過:-123.45

<xsl:if test="number($current) = number($current)"> 
    <xsl:value-of select="$current"/> 
</xsl:if> 
+0

@joncar:請學習提問的道德規範。永遠不要改變你的問題,讓接受和提出的答案看起來不正確!更好,問一個新問題。 – 2010-10-12 16:36:20

+0

@joncar:你的例子是小數,而不是「只包含整數的數據,正如你在問題中所說的」。 – 2010-10-12 16:37:11

回答

2

我有一個問題,價值$當前變量的 進來作爲 '6E144270003',它在失敗的 撒克遜2.0處理器,錯誤爲 '投射失敗,無效的詞彙值 - xs:double'。

我不能重現這個問題。

這種轉變

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:variable name="current" select="'6E144270003'"/> 
    <xsl:template match="/"> 
    <xsl:if test="number($current) = number($current)"> 
    <xsl:value-of select="$current"/> 
</xsl:if> 

    </xsl:template> 
</xsl:stylesheet> 

當SAXON 9.0.0.4運行,產生

6E144270003 

我不確定爲什麼會這樣,當它 不是號碼以及如何 糾正它。基本上,如果它不是一個 號碼,我不希望它輸出

字符串"6E144270003"可以被用作了XPath 2.0一些,因爲在XPath 2.0中的所謂*科學notation`是表示數字的有效方法。

這是一個有趣的示例,其中XSLT 1.0和XSLT 2.0的行爲不同。

UPDATE:該任擇議定書已經表示,他希望測試如果字符串包含任何東西,但數字會評估爲false()

這可以最好用正則表達式來實現,甚至:

translate($s, '', '') eq '' 

UPDATE2:該OP再次改變了他的問題!

對於這裏的最新問題的答案:

使用

$s castable as xs:decimal 

這種轉變證明了這種方法的正確性:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

    <xsl:template match="/"> 
    <xsl:sequence select= 
     "for $s in ('1234567890', 
       '123.45', 
       '123.5', 
       '-123.45', 
       '6E144270003' 
       ) 
     return 
     if($s castable as xs:decimal) 
      then $s 
      else() 

     "/> 
    </xsl:template> 
</xsl:stylesheet> 

當這種轉變應用於任何XML文檔(未使用),產生正確的結果

1234567890 123.45 123.5 -123.45 
+0

@Dimitre:+1快速回答。這對我來說也是一樣的。我認爲它應該指出,這不是XSLT 2.0中正確的數據類型測試。 OP應該使用'castable'操作符。 – 2010-10-11 22:05:56

+0

@Alejandro:'castable'對於測試某個item()是否屬於某種類型非常有用。如果OP只關注如果一個值*可以表示並用作數字*,那麼'number($ x)= number($ x)'仍然是一個很好的測試。 – 2010-10-11 22:34:26

+0

在這種情況下,數據永遠不會被表示爲「科學記數法」。我需要在這種情況下的IF條件由於'E'而失敗。 – johkar 2010-10-12 13:27:10