Как получить сумму всего числа из текста с помощью xslt 1.0 - PullRequest
0 голосов
/ 01 мая 2020

Данные для примера

<Value>YQ: LH YQ surcharge: 10.00 EUR; GB: United Kingdom Air Passenger Duty APD: 15.46 EUR; RA: Germany Passenger Service Charge International Departure: 26.59 EUR; DE: Germany Airport Security Charge: 9.50 EUR; OY: Germany Air Transport Tax: 7.38 EUR; UB: United Kingdom Passenger Service Charge Departures: 20.70 EUR</Value>

Ожидаемый результат
89,63

1 Ответ

1 голос
/ 01 мая 2020

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

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="Value">
    <total>
        <xsl:call-template name="total">
            <xsl:with-param name="string" select="concat(., '; ')"/>
        </xsl:call-template>
    </total>
</xsl:template>

<xsl:template name="total">
    <xsl:param name="string"/>
    <xsl:param name="sum" select="0"/>
    <xsl:choose>
        <xsl:when test="contains($string, ';')">
            <xsl:variable name="token" select="substring-before($string, '; ')" />
            <xsl:variable name="amount" select="substring-before(substring-after(substring-after($token, ': '), ': '), ' EUR')" />
            <xsl:call-template name="total">
                <xsl:with-param name="string" select="substring-after($string, '; ')" />
                <xsl:with-param name="sum" select="$sum + $amount" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$sum"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>
...