以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个非重复值,我需要:
现在,在原始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>答案 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>