我在将计数器应用于不同上下文时遇到问题。我有以下XML——重点应该放在E1EDL24/POSNR
元素上。我有许多CCD_ 2元素,它们具有相同的CCD_。
我有以下简化的XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<DELVRY03>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN>0002012439</VBELN>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>AG</PARTNER_Q>
</E1ADRM1>
<E1EDL24 SEGMENT="1">
<POSNR>10</POSNR>
<MATNR>000000000000722111</MATNR>
<CHARG>D5815</CHARG>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>10</POSNR>
<MATNR>000000000000722111</MATNR>
<CHARG>D5815</CHARG>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>10</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5915</CHARG>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>70</POSNR>
<MATNR>000000000000392652</MATNR>
<CHARG>L1514</CHARG>
<LFIMG>216</LFIMG>
<HIPOS>70</HIPOS>
<EAN11>3046920926522</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>30</POSNR>
<MATNR>000000000000770600</MATNR>
<CHARG>D1915</CHARG>
<LFIMG>2</LFIMG>
<HIPOS>30</HIPOS>
<EAN11>7340057737409</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>30</POSNR>
<MATNR>000000000000770600</MATNR>
<CHARG>D1915</CHARG>
<LFIMG>2</LFIMG>
<HIPOS>30</HIPOS>
<EAN11>7340057737409</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
</E1EDL20>
</IDOC>
</DELVRY03>
我将以下XSLT应用于它:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="ISO-8859-1" method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="E1EDL24[(POSNR = following::E1EDL24/POSNR or POSNR = preceding::E1EDL24/POSNR)
and (MATNR = following::E1EDL24/MATNR or MATNR = preceding::E1EDL24/MATNR)]">
<xsl:variable name="counter">
<xsl:number/>
</xsl:variable>
<E1EDL24>
<POSNR>
<xsl:value-of select="concat('90000',$counter)"/>
</POSNR>
<MATNR>
<xsl:value-of select="MATNR"/>
</MATNR>
<MATWA>
<xsl:value-of select="MATNR"/>
</MATWA>
<CHARG>
<xsl:value-of select="CHARG"/>
</CHARG>
<KDMAT/>
<LFIMG>
<xsl:value-of select="LFIMG"/>
</LFIMG>
<HIPOS>
<xsl:value-of select="HIPOS"/>
</HIPOS>
<EAN11>
<xsl:value-of select="EAN11"/>
</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
</xsl:template>
</xsl:stylesheet>
我得到这个输出:
<?xml version="1.0" encoding="ISO-8859-1"?>
<DELVRY03>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN>0002012439</VBELN>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>AG</PARTNER_Q>
</E1ADRM1>
<E1EDL24>
<POSNR>900001</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5815</CHARG>
<KDMAT/>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900002</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5815</CHARG>
<KDMAT/>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900003</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5915</CHARG>
<KDMAT/>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>70</POSNR>
<MATNR>000000000000392652</MATNR>
<CHARG>L1514</CHARG>
<LFIMG>216</LFIMG>
<HIPOS>70</HIPOS>
<EAN11>3046920926522</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900005</POSNR>
<MATNR>000000000000770600</MATNR>
<MATWA>000000000000770600</MATWA>
<CHARG>D1915</CHARG>
<KDMAT/>
<LFIMG>2</LFIMG>
<HIPOS>30</HIPOS>
<EAN11>7340057737409</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900006</POSNR>
<MATNR>000000000000770600</MATNR>
<MATWA>000000000000770600</MATWA>
<CHARG>D1915</CHARG>
<KDMAT/>
<LFIMG>2</LFIMG>
<HIPOS>30</HIPOS>
<EAN11>7340057737409</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
</E1EDL20>
</IDOC>
但我期待以下输出:
<?xml version="1.0" encoding="ISO-8859-1"?>
<DELVRY03>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN>0002012439</VBELN>
<E1ADRM1 SEGMENT="1">
<PARTNER_Q>AG</PARTNER_Q>
</E1ADRM1>
<E1EDL24>
<POSNR>900001</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5815</CHARG>
<KDMAT/>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900002</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5815</CHARG>
<KDMAT/>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900003</POSNR>
<MATNR>000000000000722111</MATNR>
<MATWA>000000000000722111</MATWA>
<CHARG>D5915</CHARG>
<KDMAT/>
<LFIMG>6</LFIMG>
<HIPOS>10</HIPOS>
<EAN11>7340057734507</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>70</POSNR>
<MATNR>000000000000392652</MATNR>
<CHARG>L1514</CHARG>
<LFIMG>216</LFIMG>
<HIPOS>70</HIPOS>
<EAN11>3046920926522</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>XYZ</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900001</POSNR>
<MATNR>000000000000770600</MATNR>
<MATWA>000000000000770600</MATWA>
<CHARG>D1915</CHARG>
<KDMAT/>
<LFIMG>2</LFIMG>
<HIPOS>30</HIPOS>
<EAN11>7340057737409</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
<E1EDL24>
<POSNR>900002</POSNR>
<MATNR>000000000000770600</MATNR>
<MATWA>000000000000770600</MATWA>
<CHARG>D1915</CHARG>
<KDMAT/>
<LFIMG>2</LFIMG>
<HIPOS>30</HIPOS>
<EAN11>7340057737409</EAN11>
<E1EDL19 SEGMENT="1">
<QUALF>BAS</QUALF>
<PARAM/>
</E1EDL19>
</E1EDL24>
</E1EDL20>
</IDOC>
请参阅预期输出中最后两个E1EDL24
元素的POSNR
值再次从900001
开始。但我如何才能实现计数器重新启动?现在它一直在计数,这是我不想要的。
首先,您可以通过密钥更快地查找重复项
<xsl:key name="POSNR" match="E1EDL24" use="POSNR" />
<xsl:key name="MATNR" match="E1EDL24" use="MATNR" />
然后,您的模板匹配简化为以下内容:
<xsl:template match="E1EDL24[key('POSNR', POSNR)[2] and key('MATNR', MATNR)[2]]">
然后,作为第一次尝试,尝试将counter
变量更改为此
<xsl:variable name="counter">
<xsl:number count="E1EDL24[key('POSNR', current()/POSNR)[2] and key('MATNR', current()/MATNR)[2]]" />
</xsl:variable>
如果因为你使用的处理器,这不起作用,试试这个
<xsl:variable name="counter"
select="count(preceding::E1EDL24[key('POSNR', current()/POSNR)[2] and key('MATNR', current()/MATNR)[2]]) + 1" />