2010-07-29 75 views
2

期間保留的處理過程中位數輸入 - >號 - >輸出對於該XSLT:XSLT處理

<xsl:variable name="source0" select="number(num2)"/> 
    <xsl:variable name="source1" select="number(num3)"/> 
    s0 plain: <xsl:value-of select="$source0"/> 
    s1 plain: <xsl:value-of select="$source1"/> 
    test11: <xsl:value-of select="format-number($source0, '#.#')"/> 
    test12: <xsl:value-of select="format-number($source0, '#.###############')"/> 
    test21: <xsl:value-of select="format-number($source1, '#.#')"/> 
    test22: <xsl:value-of select="format-number($source1, '#.###############')"/> 

對於XML:

<num2>123456.1234</num2> 
<num3>1234567.1234</num3> 

我得到如下的輸出(使用撒克遜9.2,XSLT 2.0)

s0 plain: 123456.1234 
    s1 plain: 1.2345671234E6 
    test11: 123456.1 
    test12: 123456.123399999996764 
    test21: 1234567.1 
    test22: 1234567.123399999924004 

首先......我很好奇爲什麼它突然標準和科學記數法之間時,它EXCE切換在小數點左邊編輯6位數字?這是我的問題,我想避免科學記數法。在其他各種問題之後,我發現顯然我堅持把格式編號放在任何地方。

但格式編號似乎也不工作。儘管事實上「s1 plain」的輸出證明了處理器已知有效數字的數目(我知道轉換爲double和back會失去精度,但在這種轉換之後有正確的數字,所以...?),似乎沒有辦法以標準的非科學記數法輸出該值。在那兒?

+0

好問題(+1)。查看我的答案以獲得最高精度的解決方案。 – 2010-07-30 04:27:01

+0

雙字符串轉換的XSLT 2.0規範說,如果值超出範圍1e-6到1e + 6,應該使用指數表示法。當然,這些分界點完全是任意的,但是你不希望1e215用慢速寫出來...... – 2011-01-14 20:38:19

+0

認爲「處理器已知有效數字的數量」是錯誤的。如果您想更多地瞭解所使用的算法,Saxon的轉換基於這篇着名的論文:http://portal.acm.org/citation.cfm?id=93559適應XPath規範的要求。 – 2011-01-14 20:41:16

回答

2

這是我的問題,我想避免 科學記數法。各種 其他問題後,我發現顯然 我堅持把格式編號 無處不在。

但是格式編號並不出現在 工作。

顯然,您沒有使用XSLT 2.0/XPath 2.0的相應功能

這種轉變:

<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:variable name="vs0" as="xs:decimal" 
    select="xs:decimal(num2)"/> 

    <xsl:variable name="vs1" as="xs:decimal" 
    select="xs:decimal(num3)"/> 

    s0 plain: <xsl:value-of select="$vs0"/> 
    s1 plain: <xsl:value-of select="$vs1"/> 
    test11: <xsl:value-of select="format-number($vs0, '#.#')"/> 
    test12: <xsl:value-of select="format-number($vs0, '#.###############')"/> 
    test21: <xsl:value-of select="format-number($vs1, '#.#')"/> 
    test22: <xsl:value-of select="format-number($vs1, '#.###############')"/> 

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

當這個XML文檔施加:

<nums> 
    <num2>123456.1234</num2> 
    <num3>1234567.1234</num3> 
</nums> 

可生產精確的結果

s0 plain: 123456.1234 
s1 plain: 1234567.1234 
test11: 123456.1 
test12: 123456.1234 
test21: 1234567.1 
test22: 1234567.1234 

結論:當需要高精度時,總是嘗試使用xs:decimal數據類型。

+0

+1好答案! @taotree:這是我在另一個問題中寫作「鑄造」並使用「內置數據類型構造函數」 – 2010-07-30 13:42:00

+0

實際上,使用xs:decimal時根本不需要使用格式編號。所有你需要做的就是將它轉換爲xs:decimal,並且它總是以十進制(非科學)符號輸出。我確實需要檢查空字符串,因爲number()是寬容的,但是xs:decimal()不是。 if(string-length(normalize-space($ value))> 0)then xs:decimal($ value)else number($ value) – mentics 2010-07-30 20:19:53