我正在创建一个VAT发票导出,以便通过PEPPOL分发,在该导出中,需要对某个类型的所有行进行汇总,该汇总被节点"itemref“中的值删除。我需要一个以vatbaseprincipal_iso表示的值的和。
输入XML:
<?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,我一直试图让它像这样工作:
<?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?)这是该代码的结果:
<?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>我想要的是:
<?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列作为键。)
发布于 2022-08-04 08:39:01
你为什么不能简单地做:
XSLT1.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="/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
<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>这两个选项都可以简化一点,具体取决于您使用的处理器。
https://stackoverflow.com/questions/73218846
复制相似问题