Вычтите два значения в цикле for-each - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь вычесть два значения MaxTaxFreeValue - Reduction внутри цикла for-each, но в результате получаю NaN.Как мне это исправить?

<xsl:for-each select="Position">
    <TR CLASS="position leftRightPadding">
        <TD />
        <TD CLASS="alignRight" STYLE="min-width:85px;"><xsl:value-of select="Date" /></TD>
        <TD CLASS="alignLeft"><xsl:value-of select="Text" /></TD>
        <TD><xsl:value-of select="MaxTaxFreeValue"/></TD>
        <TD><xsl:value-of select="Reduction"/></TD>
        <TD><xsl:value-of select=number("MaxTaxFreeValue" - "Reduction")/></TD>
        <TD><xsl:value-of select="Account"/></TD>
        <TD><xsl:value-of select="ValueAddedTaxPercentValue"/></TD>
        <TD><xsl:value-of select="KindOfPayment"/></TD>
        <xsl:for-each select="FreeFields/FreeField">
            <TD class="alignLeft"><xsl:value-of select="Value" disable-output-escaping="yes"/></TD>
        </xsl:for-each>
    </TR>
</xsl:for-each>

1 Ответ

0 голосов
/ 25 сентября 2019

В числах XSLT / XPATH в качестве десятичного знака должен использоваться точка, а не запятая, как в некоторых культурах.Он также может не содержать никаких символов валюты (см. https://www.w3.org/TR/xpath-10/#NT-Number)

. Поэтому вам нужно удалить любой символ валюты или пробел из вашего элемента, а затем преобразовать в число. Если ваши значения ограничены тем, что онсодержит, вы можете сделать это

<xsl:value-of select="number(translate(MaxTaxFreeValue, ',€ ', '.')) 
                        + number(translate(Reduction, ',€ ', '.'))" />

Обратите внимание на использование + здесь, а не -. Если вы вычтите отрицательное число из другого числа, то это то же самое, что добавление положительной версииэто число, поэтому я думаю, что вам действительно нужно добавить здесь, если Reduction всегда будет отрицательным.

См. http://xsltfiddle.liberty -development.net / 94AbWAN в качестве примера. Обратите внимание, чтоэто работает только с символом валюты евро, а также предполагает, что элементы не являются пустыми.

С другой стороны, если вы хотите обработать неожиданные символы или элементы могут быть пустыми, вам, вероятно, потребуетсячтобы создать именованный шаблон для преобразования, так как вам потребуется больше работы с двойным переводом:

<xsl:template name="convertToNumber">
  <xsl:param name="element" />
  <xsl:choose>
      <xsl:when test="normalize-space($element)">
          <xsl:value-of select="translate($element, concat(',', translate($element, '-01234567890', '')), '.')" />
      </xsl:when>
      <xsl:otherwise>0</xsl:otherwise>
  </xsl:choose>
</xsl:template>

Вложенный перевод вернет нечисловые символыв строке, которая затем используется для удаления их из основной строки.

Затем вы можете использовать переменные, которые вызывают этот шаблон, для выполнения вычисления

<xsl:variable name="maxTaxFreeValue">
    <xsl:call-template name="convertToNumber">
        <xsl:with-param name="element" select="MaxTaxFreeValue" />
    </xsl:call-template>
</xsl:variable>
<xsl:variable name="reduction">
    <xsl:call-template name="convertToNumber">
        <xsl:with-param name="element" select="Reduction" />
    </xsl:call-template>
</xsl:variable>
<xsl:value-of select="number($maxTaxFreeValue) + number($reduction)" />

См.http://xsltfiddle.liberty -development.net / 94AbWAN / 1 для примера этого

Конечно, если бы вы могли использовать XSLT 2.0, вы могли бы использовать функцию вместо именованного шаблона, наряду сс оператором replace.

<xsl:function name="my:convertToNumber" as="xs:decimal">
  <xsl:param name="element" />
  <xsl:value-of select="if (normalize-space($element)) then replace(replace($element, ',', '.'), '[^\.\-0-9]', '') else 0" />
</xsl:function>

См. http://xsltfiddle.liberty -development.net / 94AbWAN / 2 для примера этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...