全局计数器XSLT 1.0

时间:2018-11-19 11:31:35

标签: xslt-1.0

这是我必须转换的XML输入:

<_-FOX_-SHPMNT06>
<IDOC BEGIN="1">
    <E1EDT20 SEGMENT="1">
        <TKNUM>8201333969</TKNUM>
        <TPBEZ>FDC Domestic YT</TPBEZ`
        <E1EDL20 SEGMENT="1">
            <VBELN>3460011248</VBELN>
            <E1EDT13 SEGMENT="1">
                <QUALF>015</QUALF>
                <NTANF>20181016</NTANF>
                <NTANZ>000000</NTANZ>
                <NTEND>20181016</NTEND>
                <NTENZ>000000</NTENZ>
                <ISDD>00000000</ISDD>
                <ISDZ>000000</ISDZ>
                <IEDD>00000000</IEDD>
                <IEDZ>000000</IEDZ>
            </E1EDT13>
            <E1TXTH8 SEGMENT="1">
                <TDOBJECT>VBBK</TDOBJECT>
                <TDOBNAME>3460011248</TDOBNAME>
                <TDID>Z022</TDID>
                <TDSPRAS>D</TDSPRAS>
                <LANGUA_ISO>DE</LANGUA_ISO>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT>*</TDFORMAT>
                    <TDLINE>Der Unterzeichner erklärt, dass die in diesem Dokument aufgeführten</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDLINE>Waren Ursprungserzeugnisse aus China sind und im Präferenzverkehr mit</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDLINE>CH-EU entsprechen.</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT>*</TDFORMAT>
                </E1TXTP8>
            </E1TXTH8>
            <E1TXTH8 SEGMENT="1">
                <TDOBJECT>VBBK</TDOBJECT>
                <TDOBNAME>3460011248</TDOBNAME>
                <TDID>Z024</TDID>
                <TDSPRAS>D</TDSPRAS>
                <LANGUA_ISO>DE</LANGUA_ISO>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT>*</TDFORMAT>
                    <TDLINE>Ihre Artikelnr. 0068018</TDLINE>
                </E1TXTP8>
            </E1TXTH8>
        </E1EDL20>
    </E1EDT20>
</IDOC>
</_-FOX_-SHPMNT06>

这就是我需要的XML结果:

<_-FOX_-SHPMNT06>
<IDOC BEGIN="1">
    <E1EDT20 SEGMENT="1">
        <TKNUM>8201333969</TKNUM>
        <TPBEZ>FDC Domestic YT</TPBEZ>
        <E1EDL20 SEGMENT="1">
            <VBELN>3460011248</VBELN>
            <E1TXTH8 SEGMENT="1">
                <TDOBJECT/>
                <TDOBNAME/>
                <TDID/>
                <TDSPRAS/>
                <LANGUA_ISO/>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT/>
                    <TDLINE>@ 01 E Der Unterzeichner erklärt, dass die in diesem Dokument aufgeführten</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT/>
                    <TDLINE>@ 02 E Waren Ursprungserzeugnisse aus China sind und im Präferenzverkehr mit</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT/>
                    <TDLINE>@ 03 E CH-EU entsprechen.</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT/>
                    <TDLINE>@ 04 E </TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT/>
                    <TDLINE>@ 05 E Ihre Artikelnr. 0068018</TDLINE>
                </E1TXTP8>
            </E1TXTH8>
            <E1TXTH8 SEGMENT="1">
                <TDOBJECT>VBBK</TDOBJECT>
                <TDOBNAME>3460011248</TDOBNAME>
                <TDID>Z022</TDID>
                <TDSPRAS>D</TDSPRAS>
                <LANGUA_ISO>DE</LANGUA_ISO>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT>*</TDFORMAT>
                    <TDLINE>Der Unterzeichner erklärt, dass die in diesem Dokument aufgeführten</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDLINE>Waren Ursprungserzeugnisse aus China sind und im Präferenzverkehr mit</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDLINE>CH-EU entsprechen.</TDLINE>
                </E1TXTP8>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT>*</TDFORMAT>
                </E1TXTP8>
            </E1TXTH8>
            <E1TXTH8 SEGMENT="1">
                <TDOBJECT>VBBK</TDOBJECT>
                <TDOBNAME>3460011248</TDOBNAME>
                <TDID>Z024</TDID>
                <TDSPRAS>D</TDSPRAS>
                <LANGUA_ISO>DE</LANGUA_ISO>
                <E1TXTP8 SEGMENT="1">
                    <TDFORMAT>*</TDFORMAT>
                    <TDLINE>Ihre Artikelnr. 0068018</TDLINE>
                </E1TXTP8>
            </E1TXTH8>
        </E1EDL20>
    </E1EDT20>
</IDOC>
</_-FOX_-SHPMNT06>

我需要获取一个全局计数器而不是使用“ position()”,因为我不希望在每个“ for-each”中将该计数器重置为0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<!-- Identity template : copy all text nodes, elements and attributes -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="E1EDT13[position()=last()]">
    <E1TXTH8 SEGMENT="1">
        <TDOBJECT/>
        <TDOBNAME/>
        <TDID/>
        <TDSPRAS/>
        <LANGUA_ISO/>
        <xsl:for-each select="following-sibling::E1TXTH8[TDID='Z002']/E1TXTP8">
            <E1TXTP8 SEGMENT="1">
                <xsl:variable name="typeA">A</xsl:variable>
                <TDFORMAT/>
                <TDLINE>
                    <xsl:value-of select="concat('@', ' ', format-number(position(),'00'), ' ', $typeA, ' ', TDLINE)"/>
                </TDLINE>
            </E1TXTP8>
        </xsl:for-each>
        <xsl:for-each select="following-sibling::E1TXTH8[TDID='Z022']/E1TXTP8">
            <E1TXTP8 SEGMENT="1">
                <xsl:variable name="typeE">E</xsl:variable>
                <TDFORMAT/>
                <TDLINE>
                    <xsl:value-of select="concat('@', ' ', format-number(position(),'00'), ' ', $typeE, ' ', TDLINE)"/>
                </TDLINE>
            </E1TXTP8>
        </xsl:for-each>
        <xsl:for-each select="following-sibling::E1TXTH8[TDID='Z024']/E1TXTP8">
            <E1TXTP8 SEGMENT="1">
                <xsl:variable name="typeE">E</xsl:variable>
                <TDFORMAT/>
                <TDLINE>
                    <xsl:value-of select="concat('@', ' ', format number(position(),'00'), ' ', $typeE, ' ', TDLINE)"/>
                </TDLINE>
            </E1TXTP8>
        </xsl:for-each>
    </E1TXTH8>
</xsl:template>
</xsl:stylesheet>

有什么办法可以管理它?如果我使用“ position()”,则计数器将为01 02 03 04 01,即使我有更多的“ for each”,我也需要01 02 03 04 05

0 个答案:

没有答案