2

W3 发布了 X-Path 3.0,可以相应地处理以下问题。

此时,我的环境仍然是 X-Path 2.0,因此我面临的问题。

请帮助我如何在 X-Path 中运行它,

10 * 10^3;

给出的场景如下,

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

这里的想法是根据小数获得最终的权重。这里的结果是'0.099'

为了让我实现这一目标,我需要采取

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

问题是,
如何使用 X-Path 2.0获得10^3 。
或者还有其他方法可以从不同的角度加入 X-Path?

谢谢社区。

4

2 回答 2

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

二、如果可以使用 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
于 2016-05-18T03:42:04.193 回答
0

如果您只需要 10 次方且不超过 15 位精度,则可以将其转换为 double:

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

这行得通,因为像这样的双精度99E-399 div 1000.0

于 2016-06-08T23:01:34.133 回答