XSLT - Добавление нескольких значений элементов xml, содержащих знак $ - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь написать код XSLT, в который мне нужно добавить все значения суммы, представленные в приведенном ниже фрагменте файла xml:

XML:

<AmountDetails>
    <Amount>
        <PremiumAmount>$100</PremiumAmount>
        <PremiumAmount>$200</PremiumAmount>
        <PremiumAmount>$300</PremiumAmount>
    </Amount>
    <Amount>
        <PremiumAmount>$300</PremiumAmount>
        <PremiumAmount>$400</PremiumAmount>
        <PremiumAmount>$600</PremiumAmount>
    </Amount>
</AmountDetails>

XSLT:

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="/">
            <xsl:apply-templates select="AmountDetails"/>
        </xsl:template>
    
        <xsl:template match="AmountDetails">
             <sum>
                 <value>sum(substring(//PremiumAmount),2,4)</value>
             </sum>
        </xsl:template>
        
     
    </xsl:stylesheet>

Но я получаю следующее сообщение об ошибке:

Последовательность из более чем одного элемента не допускается в качестве первого аргумента функции fn: substring () ("$ 100 "," 200 долларов "...)

Ответы [ 2 ]

1 голос
/ 01 августа 2020

В XSLT 2.0 вы можете просто:

<xsl:stylesheet version="2.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="/AmountDetails">
    <sum>
        <xsl:value-of select="sum(Amount/PremiumAmount/number(substring(., 2)))"/>
    </sum>
</xsl:template>
        
</xsl:stylesheet>
0 голосов
/ 01 августа 2020

Это не работает как есть, потому что он пытается применить функцию substring к набору узлов, когда ее нужно применить к строке (текстовое содержимое узла).

Я бы хотел, чтобы это было чтобы быть лучшим способом сделать это, но вот что я получил (XSLT 1.0):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"
    version="1.0"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

...

<xsl:template match="AmountDetails">
    <xsl:variable name="x">
        <xsl:for-each select="//PremiumAmount">
            <item><xsl:value-of select="substring(., 2, 4)" /></item>
        </xsl:for-each>
    </xsl:variable>

    <xsl:value-of select="sum(exsl:node-set($x)/item)" />
</xsl:template>

...

</xsl:stylesheet>

По сути, мы создаем переменную x, которая выглядит так:

<item>100</item>
<item>200</item>
<item>300</item>
...

И затем суммируем выражение $x/item, которое выбирает все узлы элементов в x.

...