2016-05-17 11 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)); 

вопрос,
Как я могу получить 10^3 с помощью X-Path 2.0.
Или есть другие способы, которыми неподвижные изображения включают X-Path, но под другим углом?

Спасибо.

+1

Можете ли вы использовать XSLT 2.0? XPath обычно размещается на другом языке - это XSLT 2.0, язык хостинга, или если нет, можете ли вы описать среду хостинга? –

ответ

1

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>&#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

Если вы требуется только десятикратная точность и точность не более 15 цифр, вы можете использовать ее в двух направлениях:

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

Это работает, потому что двойное значение, например 99E-3, равно 99 div 1000.0