XSLT1.0:在自转换中应用上下文更改计数器



我在将计数器应用于不同上下文时遇到问题。我有以下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" />

相关内容

  • 没有找到相关文章

最新更新