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>
</xsl:text>
<xsl:value-of select="f:pow($vPi, $vE)"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="f:pow(1024E0, 0.1E0)"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="f:log2(1024E0)"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="f:ln(f:pow($vE, $vPi))"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="f:pow(f:pow($vE, $vPi), 1 div $vPi)"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="f:pow(2 div 3, 99)"/>
-------------
<xsl:text/>
<xsl:value-of separator="'
'" 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