首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT中多个in的求和

XSLT中多个in的求和
EN

Stack Overflow用户
提问于 2022-08-03 08:49:29
回答 1查看 50关注 0票数 0

我正在创建一个VAT发票导出,以便通过PEPPOL分发,在该导出中,需要对某个类型的所有行进行汇总,该汇总被节点"itemref“中的值删除。我需要一个以vatbaseprincipal_iso表示的值的和。

输入XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<export>
    <datalist>
    <currencycode>SEK</currencycode>
        <row>
            <itemref>208</itemref>
            <vatbaseprincipal_iso>695.0000</vatbaseprincipal_iso>
            <vatrate_iso>25.0000</vatrate_iso>
        </row>
        <row>
            <itemref>209</itemref>
            <vatbaseprincipal_iso>595.0000</vatbaseprincipal_iso>
            <vatrate_iso>25.0000</vatrate_iso>
        </row>
        <row>
            <itemref>206</itemref>
            <vatbaseprincipal_iso>1295.0000</vatbaseprincipal_iso>
            <vatrate_iso>25.0000</vatrate_iso>
        </row>
        <row>
            <itemref>099</itemref>
            <vatbaseprincipal_iso>15.8200</vatbaseprincipal_iso>
            <vatrate_iso>25.0000</vatrate_iso>
        </row>
        <row>
            <itemref>090</itemref>
            <vatbaseprincipal_iso>3370.0000</vatbaseprincipal_iso>
            <vatrate_iso>25.0000</vatrate_iso>
        </row>
    </datalist>
</export>

节点"itemref“可以包含值09,090或099,我一直试图让它像这样工作:

代码语言:javascript
复制
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>

    <xsl:key name="vatrows" match="row[itemref = '09']|row[itemref = '090']|row[itemref = '099']" use="itemref"/>
    
    <xsl:template match="/export/datalist">
        <Invoice>
            <TaxTotal>
                <xsl:apply-templates select="row[generate-id(.) = generate-id(key('vatrows', itemref))]" mode="vatsum_vatrow"/>
            </TaxTotal>         
        </Invoice>
    </xsl:template>

    <xsl:template match="row" mode="vatsum_vatrow">
                <TaxSubTotal>
                    <TaxableAmount>
                        <xsl:attribute name="amountCurrencyID">
                            <xsl:value-of select="../currencycode"/>
                        </xsl:attribute>
                        <xsl:value-of select="translate(translate(-1 * (sum(../row[itemref = '09']/vatbaseprincipal_iso) 
                            + sum(../row[itemref = '090']/vatbaseprincipal_iso) 
                            + sum(../row[itemref = '099']/vatbaseprincipal_iso)),',','.'),' ','')"/>
                    </TaxableAmount>
                </TaxSubTotal>  
    </xsl:template>
</xsl:stylesheet>

问题是我在结果中得到了两个和,因为输入XML中有两个不同的值,090和099 (我猜"key“函数为每个命中返回一个新ID?)这是该代码的结果:

代码语言:javascript
复制
<?xml version="1.0" encoding="ISO-8859-1"?>
    <Invoice>
    <TaxTotal>
        <TaxSubTotal>
            <TaxableAmount amountCurrencyID="SEK">-3385.82</TaxableAmount>
        </TaxSubTotal>
        <TaxSubTotal>
            <TaxableAmount amountCurrencyID="SEK">-3385.82</TaxableAmount>
        </TaxSubTotal>
    </TaxTotal>
</Invoice>

我想要的是:

代码语言:javascript
复制
<?xml version="1.0" encoding="ISO-8859-1"?>
    <Invoice>
    <TaxTotal>
        <TaxSubTotal>
            <TaxableAmount amountCurrencyID="SEK">-3385.82</TaxableAmount>
        </TaxSubTotal>
    </TaxTotal>
</Invoice>

(所有这些都来自Peppol电子发票标准并不真正支持增值税发票的复杂之处,因此在出口中有一些修补工作要做。这就是为什么,尽管输入XML中的vatrate_iso对于所有行都是25.000,但我们需要将这些特定行加到零税率。否则,我会使用vatrate_iso列作为键。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 08:39:01

你为什么不能简单地做:

XSLT1.0

代码语言:javascript
复制
<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="/export ">
    <Invoice>
        <TaxTotal>
            <TaxSubTotal>
                <TaxableAmount amountCurrencyID="{datalist/currencycode}">
                     <xsl:value-of select="-sum(datalist/row[itemref='09' or itemref='090' or itemref='099']/vatbaseprincipal_iso)"/>
                </TaxableAmount>
            </TaxSubTotal>
        </TaxTotal>
</Invoice>
</xsl:template>

</xsl:stylesheet>

或者,如果您想为此使用密钥,则可能:

XSLT1.0

代码语言:javascript
复制
<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:key name="row" match="row" use="itemref" />

<xsl:template match="/export">
    <Invoice>
        <TaxTotal>
            <TaxSubTotal>
                <TaxableAmount amountCurrencyID="{datalist/currencycode}">
                     <xsl:value-of select="-sum(key('row', '09')/vatbaseprincipal_iso) - sum(key('row', '090')/vatbaseprincipal_iso) - sum(key('row', '099')/vatbaseprincipal_iso)"/>
                </TaxableAmount>
            </TaxSubTotal>
        </TaxTotal>
</Invoice>
</xsl:template>

</xsl:stylesheet>

这两个选项都可以简化一点,具体取决于您使用的处理器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73218846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档