I. Вот +2,0 выражение XPath, которое производит результат умножения целого числа на положительное или отрицательное целое число мощности 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>
</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
Можете ли вы использовать XSLT 2.0? XPath обычно размещается на другом языке - это XSLT 2.0, язык хостинга, или если нет, можете ли вы описать среду хостинга? –