В числах 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 для примера этого.