XSL 1.0 - 添加新发票行

时间:2013-12-27 12:15:41

标签: xslt

以xml结构为出发点:

<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字段)。

结果需要看起来像这样:

<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值),对于2个非重复值,我需要:

  • 总结E1EDP01 / E1EDP26 / BETRG,这将是我的WAARDE字段值
  • 总结E1EDP01 / BRGEW,这将是我的BRUTTO字段值
  • 总结E1EDP01 / NTGEW,这将是我的NETTO字段值
  • 制作2个新的发票行,增加ROWID(就像上面描述的结果一样 - 3个原始发票行保留其特定的逻辑和格式,并且最后必须添加这2个新行。)

现在,在原始xml(上面)...

上执行这段特殊代码
<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>
  • 如何将两者绑在一起???

请帮帮忙?

谢谢你, 吨。

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

2 个答案:

答案 0 :(得分:1)

怎么样:

<ROWID><xsl:value-of select="count(../E1EDP01)+position()"/></ROWID>

答案 1 :(得分:0)

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

<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>