首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSL 1.0 -添加新的发票行

XSL 1.0 -添加新的发票行
EN

Stack Overflow用户
提问于 2013-12-27 12:15:40
回答 2查看 174关注 0票数 1

以这个xml结构为起点:

代码语言:javascript
复制
<records>
  <E1EDP01>
    <POSEX>00001</POSEX>
    <BRGEW>302.176</BRGEW>
    <NTGEW>243.257</NTGEW>
    <E1EDP19>
      <QUALF>007</QUALF>
      <IDTNR>2105009900</IDTNR>
    </E1EDP19>
    <E1EDP26 SEGMENT="1">
      <QUALF>003</QUALF>
      <BETRG>965.58</BETRG>
    </E1EDP26>
  </E1EDP01>
  <E1EDP01>
    <POSEX>00002</POSEX>
    <BRGEW>134.520</BRGEW>
    <NTGEW>122.835</NTGEW>
    <E1EDP19>
      <QUALF>007</QUALF>
      <IDTNR>2105009900</IDTNR>
    </E1EDP19>
    <E1EDP26 SEGMENT="1">
      <QUALF>003</QUALF>
      <BETRG>1630.20</BETRG>
    </E1EDP26>
  </E1EDP01>
  <E1EDP01>
    <POSEX>00003</POSEX>
    <BRGEW>5.000</BRGEW>
    <NTGEW>4.000</NTGEW>
    <E1EDP19>
      <QUALF>007</QUALF>
      <IDTNR>2105001000</IDTNR>
    </E1EDP19>
    <E1EDP26 SEGMENT="1">
      <QUALF>003</QUALF>
      <BETRG>1773.78</BETRG>
    </E1EDP26>
  </E1EDP01>
</records>

基本上,这是一个包含3行和2种不同产品的发票(因为E1EDP19/IDTNR字段)。

结果需要如下所示:

代码语言:javascript
复制
<xml>
  <line>
    <rowid>1</rowid>
    ... stuff not really relevant ...
  </line>
  <line>
    <rowid>2</rowid>
    ... stuff not really relevant ...
  </line>
  <line>
    <rowid>3</rowid>
    ... stuff not really relevant ...
  </line>
  <line>
    <rowid>4</rowid>
    <doucdtot>1</doucdtot>
    <doucd>2105009900<doucd>
    <waarde>2.595,78</waarde>
    <brutto>436,70</brutto>
    <netto>366,09</netto>
  </line>
  <line>
    <rowid>5</rowid>
    <doucdtot>1</doucdtot>
    <doucd>2105001000<doucd>
    <waarde>1.773,78</waarde>
    <brutto>5,00</brutto>
    <netto>4,00</netto>
  </line>
</xml>

换句话说,我需要从原始xml中提取不重复的E1EDP19/IDTNR (这些是我的DOUCD值),对于两个不重复的值,我需要:

  • 总结E1EDP01/E1EDP26/BETRG,这将是我的WAARDE字段值
  • 总结E1EDP 01/BRGEW,这将是我的BRUTTO字段值
  • 总结E1EDP 01/NTGEW,这将是我的NETTO字段值
  • 创建两个新的发票行,并增加ROWID (就像上面描述的结果一样-3条原始发票行保持其特定的逻辑和格式,这2条新行必须在末尾添加)。

现在,在原始xml上执行这段特定的代码(上面).

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:decimal-format name="d" decimal-separator="," grouping-separator="." />
<xsl:key name="key1" match="E1EDP01" use="E1EDP19[QUALF='007']/IDTNR"/>
<xsl:template match="records">
    <xml>
        <xsl:for-each select="E1EDP01[count(. | key('key1', E1EDP19[QUALF='007']/IDTNR)[1]) = 1]">
            <line>
                <ROWID></ROWID>
                <doucdtot>1</doucdtot>
                <DOUCD>
                    <xsl:value-of select="E1EDP19[QUALF='007']/IDTNR"/>
                </DOUCD>
                <WAARDE>
                    <xsl:value-of select="format-number(sum(key('key1', E1EDP19[QUALF='007']/IDTNR)/E1EDP26[QUALF='003']/BETRG), '#.##0,00', 'd' )"></xsl:value-of>
                </WAARDE>
                <BRUTO>
                    <xsl:value-of select="format-number(sum(key('key1', E1EDP19[QUALF='007']/IDTNR)/BRGEW), '#.##0,00', 'd' )"></xsl:value-of>
                </BRUTO>
                <NETTO>
                    <xsl:value-of select="format-number(sum(key('key1', E1EDP19[QUALF='007']/IDTNR)/NTGEW), '#.##0,00', 'd' )"></xsl:value-of>
                </NETTO>
            </line>
        </xsl:for-each>
    </xml>
</xsl:template>

..。你最终会得到大多数问题的解决,除了<rowid>部分,对于我的生活,它无法弄清楚我到底该怎么做……

  • 我知道我可以知道发票有多少行(<xsl:value-of select="count(E1EDP01/POSEX)"/>)
  • 我知道我可以找出我必须在结尾添加多少“新行”(创建一个新的键<xsl:key name="key2" match="E1EDP19" use="IDTNR"/>,并使一个变量成为<xsl:value-of select="count(/*/*/E1EDP19[generate-id() = generate-id(key('key2', IDTNR)[1])])"></xsl:value-of>)。
  • 我怎么把这两件事联系起来?

请帮帮忙?

谢谢你,T。

PS:不用说,我在这方面很新,这里描述的所有逻辑都来自这个网站(非常感谢那些在不知情的情况下帮助我的其他人;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-27 12:43:44

不如:

代码语言:javascript
复制
<ROWID><xsl:value-of select="count(../E1EDP01)+position()"/></ROWID>
票数 1
EN

Stack Overflow用户

发布于 2013-12-27 12:51:18

这是怎么回事(我包括了一点整理):

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:decimal-format name="d" decimal-separator="," grouping-separator="." />
  <xsl:key name="key1" match="E1EDP01" use="E1EDP19[QUALF='007']/IDTNR"/>

  <xsl:variable name="numFmt" select="'#.##0,00'" />
  <xsl:varialbe name="origLineCount" select="count(/records/E1EDP01)" />

  <xsl:template match="records">
    <xml>
      <xsl:apply-templates 
         select="E1EDP01[generate-id() = 
                         generate-id(key('key1', E1EDP19[QUALF='007']/IDTNR)[1])]" />
    </xml>
  </xsl:template>

  <xsl:template match="E1EDP01">
    <xsl:variable name="id" select="E1EDP19[QUALF='007']/IDTNR"/>
    <xsl:variable name="mySet" select="key('key1', $id)" />

    <line>
      <ROWID>
        <xsl:value-of select="position() + $origLineCount"/>
      </ROWID>
      <doucdtot>1</doucdtot>
      <DOUCD>
        <xsl:value-of select="$id"/>
      </DOUCD>
      <WAARDE>
        <xsl:value-of select="format-number(sum($mySet/E1EDP26[QUALF='003']/BETRG),
                                            $numFmt, 'd' )" />
      </WAARDE>
      <BRUTO>
        <xsl:value-of select="format-number(sum($mySet/BRGEW), $numFmt, 'd' )" />
      </BRUTO>
      <NETTO>
        <xsl:value-of select="format-number(sum($mySet/NTGEW), $numFmt, 'd' )" />
      </NETTO>
    </line>
  </xsl:template>

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

https://stackoverflow.com/questions/20800557

复制
相关文章

相似问题

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