2016-05-17 49 views
2

W3發佈了X-Path 3.0,可以相應地處理以下內容。X-Path中的指數

在這一點上,我的環境仍然是X-Path 2.0,因此我面臨的問題。

對我如何才能在X-path該運行請幫助,

10 * 10^3; 

的情況下給出如下,

1) Decimals: '3'; 
2) Weight: '99'; 

這裏的想法是讓最終重量基礎上,小數點。 這裏的結果是'0.099'

爲了讓我實現這個目標,我需要採取

(99 div (10 * 10^3)); 

問題,
如何使用的x路2.0我得到10^3
或者還有其他方式仍然合併X-Path,但從不同的角度?

謝謝社區。

+1

您可以使用XSLT 2.0嗎? XPath通常由另一種語言託管 - XSLT 2.0是託管語言,如果不是,請介紹宿主環境? –

回答

1

I.這裏是XPath 2.0表達式產生通過10的

正或負的整數次冪,我們表示由$n的整數,並通過$decPow功率的整數相乘的結果

此外,我所選擇的時間間隔來迭代$decPow [-3,3]:

for $n in 999, $decPow in (-4, -3, -2, -1, 0, 1, 2, 3), 
    $n-length in string-length(string($n)), 
    $zeros in string-join(for $i in 1 to abs($decPow) 
           return '0', 
           '') 
    return 
    if($decPow ge 0) 
     then 
      concat($n, $zeros) 
      else 
      if(abs($decPow) ge $n-length) 
       then 
       concat('0.', substring($zeros, $n-length +1), $n) 
       else 
       concat(
         substring(string($n), 1, abs(abs($decPow) - $n-length)), 
         '.', 
         substring(string($n), abs(abs($decPow) - $n-length) +1) 
         ) 

當這個XPath 2.0表達式進行求值,預期的,正確的結果產生:

0.0999 0.999 9.99 99.9 999 9990 99900 999000 

以下是使用XSLT 2.0轉換(它僅評估表達式並輸出結果)的驗證:

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

    <xsl:template match="/"> 
    <xsl:sequence select= 
    "for $n in 999, $decPow in (-4, -3, -2, -1, 0, 1, 2, 3), 
     $n-length in string-length(string($n)), 
     $zeros in string-join(for $i in 1 to abs($decPow) 
            return '0', 
            '') 
     return 
     if($decPow ge 0) 
      then 
       concat($n, $zeros) 
       else 
       if(abs($decPow) ge $n-length) 
        then 
        concat('0.', substring($zeros, $n-length +1), $n) 
        else 
        concat(
          substring(string($n), 1, abs(abs($decPow) - $n-length)), 
          '.', 
          substring(string($n), abs(abs($decPow) - $n-length) +1) 
          ) 
    "/> 
    </xsl:template> 
</xsl:stylesheet> 

當這種轉化是在任何XML文檔(未使用)施加,有用,正確的結果產生:

0.0999 0.999 9.99 99.9 999 9990 99900 999000 

II。 如果可以使用XSLT 2.0,那麼FXSL函數庫提供了取冪函數(函數可以是任意雙 - 不僅是整數)和對數函數

這裏是一個快速演示:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:f="http://fxsl.sf.net/" 
exclude-result-prefixes="f xs" 
> 

    <xsl:import href="../f/func-exp.xsl"/> 

    <xsl:output method="text"/> 

    <xsl:template name="initial" match="/"> 
    <xsl:variable name="vPi" as="xs:double" 
     select="3.1415926535897932384626433832795E0"/> 
    <xsl:variable name="vE" as="xs:double" select="2.71828182845904E0"/> 

    <xsl:value-of select="f:log10(100E0)"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="f:pow($vPi, $vE)"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="f:pow(1024E0, 0.1E0)"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="f:log2(1024E0)"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="f:ln(f:pow($vE, $vPi))"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="f:pow(f:pow($vE, $vPi), 1 div $vPi)"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:value-of select="f:pow(2 div 3, 99)"/> 

    ------------- 
<xsl:text/> 
    <xsl:value-of separator="'&#xA;'" select= 
    "for $vN in (-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0, 
        1,2,3,4,5,6,7,8,9,10) 
      return f:pow(10, $vN) 
    " 
    /> 
    </xsl:template> 
</xsl:stylesheet> 

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

2.000000001444001 
22.459157762347406 
1.999999999538168 
9.999999955017541 
3.1415926541687718 
2.718281828960005 
3.6894816398697386E-18 

    ------------- 
1.0000000000000008E-10' 
'1.000000000000001E-9' 
'1.0000000000000008E-8' 
'1.0000000000000006E-7' 
'0.0000010000000000000004' 
'0.000010000000000000004' 
'0.00010000000000000005' 
'0.0010000000000000002' 
'0.010000000000000002' 
'0.1' 
'1' 
'10' 
'100' 
'1000' 
'10000' 
'100000' 
'1.0E6' 
'1.0E7' 
'1.0E8' 
'1.0E9' 
'1.0E10 
0

如果您只需要十位和十五位數以下的精度,你可以把它加倍:

xs:double(concat($weight, "E", -$decimals)) 

這是可行的,因爲像99E-3這樣的雙值是99 div 1000.0