以这个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值),对于两个不重复的值,我需要:
现在,在原始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>)。请帮帮忙?
谢谢你,T。
PS:不用说,我在这方面很新,这里描述的所有逻辑都来自这个网站(非常感谢那些在不知情的情况下帮助我的其他人;)
发布于 2013-12-27 12:43:44
不如:
<ROWID><xsl:value-of select="count(../E1EDP01)+position()"/></ROWID>发布于 2013-12-27 12:51:18
这是怎么回事(我包括了一点整理):
<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>https://stackoverflow.com/questions/20800557
复制相似问题