如何迭代XSL并获取节点

问题描述 投票:0回答:1

我正在就我在尝试迭代和 XSLT 转换时面临的挑战问题与您联系。我有以下 XML 结构,我正在尝试获取值 AUFNR、BDMNG、MATNR、MEINS、BDMNG、VORNR。

    <IDOC BEGIN="1">
        <E1AFKOL SEGMENT="1">
            <AUFNR>200000345</AUFNR>
            <BMENGE>16.000</BMENGE>
            <E1AFFLL SEGMENT="1">
                <APLZL>00000001</APLZL>
                <FLGAT>0</FLGAT>
                <PLNFL>0</PLNFL>
                <E1AFVOL SEGMENT="1">
                    <VORNR>0011</VORNR>
                    <E1RESBL SEGMENT="1">
                        <BDMNG>16.000</BDMNG>
                        <MATNR>0228737A00</MATNR>
                        <MEINS>PCE</MEINS>
                        <BDMNG>17.000</BDMNG>
                        <MATNR>0228737A01</MATNR>
                        <MEINS>PCE</MEINS>
                    </E1RESBL>
                </E1AFVOL>
                <E1AFVOL SEGMENT="1">
                    <VORNR>0021</VORNR>
                    <E1RESBL SEGMENT="1">
                        <BDMNG>48.000</BDMNG>
                        <MATNR>070106293</MATNR>
                        <MEINS>PCE</MEINS>
                    </E1RESBL>
                </E1AFVOL>
                <E1AFVOL SEGMENT="1">
                    <VORNR>0026</VORNR>
                </E1AFVOL>
                <E1AFVOL SEGMENT="1">
                    <VORNR>0027</VORNR>
                </E1AFVOL>
            </E1AFFLL>
        </E1AFKOL>
    </IDOC>
</LOIPRO04>

特别是我在迭代获取 VORNR 值时遇到了困难。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <RESULT>
            <BOM_COMPONENTS>
                <xsl:for-each select="/LOIPRO04/IDOC/E1AFKOL/E1AFFLL/E1AFVOL">
                            <xsl:for-each select="/LOIPRO04/IDOC/E1AFKOL/E1AFFLL/E1AFVOL/E1RESBL">
                                ('<xsl:value-of select="normalize-space(MATNR)" />',
                                '<xsl:value-of select="normalize-space(/LOIPRO04/IDOC/E1AFKOL/AUFNR)"/>',
                                '<xsl:value-of select="normalize-space(/LOIPRO04/IDOC/E1AFKOL/BMENGE div BDMNG)" />',
                                '<xsl:value-of select="normalize-space(/LOIPRO04/IDOC/E1AFKOL/E1AFFLL/E1AFVOL/VORNR)" />',
                                '<xsl:value-of select="normalize-space(BDMNG)" />',
                                1,
                                GETDATE()
                            )
                        <xsl:if test="position()!=last()">,</xsl:if>
                    </xsl:for-each>
                </xsl:for-each>
            </BOM_COMPONENTS>
        </RESULT>
    </xsl:template>
</xsl:stylesheet>

我想归档以下结果,安排为SQL插入的输入

                            ('0228737A00',  
                            '200000345',
                            '1',
                            '0011',
                            '16.000',
                            1,
                            GETDATE()
                            )
                        ,
                            ('0228737A01',
                            '200000345',
                            '0.9411764705882353',
                            '0011',
                            '17.000',
                            1,
                            GETDATE()
                            )
                        ,
                            ('070106293',
                            '200000345',,
                            '0.3333333333333333',
                            '0021',
                            '48.000',
                            1,
                            GETDATE()
                        )

有人可以帮我解决这个问题吗? 非常感谢!

xml xslt
1个回答
0
投票

这是一个相当大的谜题,因为元素名称很神秘,而且缺少用于预期记录的包装元素。

经过一番苦思冥想,我想我已经接近想要的结果了:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/LOIPRO04">
    <xsl:for-each select="/LOIPRO04/IDOC/E1AFKOL">
        <xsl:variable name="AUFNR" select="AUFNR"/>
        <xsl:variable name="BMENGE" select="BMENGE"/>
        <xsl:for-each select="E1AFFLL/E1AFVOL/E1RESBL/BDMNG">
            <xsl:text>(&#10;</xsl:text>
            <!-- MATNR -->
            <xsl:text>'</xsl:text>
            <xsl:value-of select="following-sibling::MATNR[1]" />
            <xsl:text>',&#10;</xsl:text>
            <!-- AUFNR -->
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$AUFNR" />
            <xsl:text>',&#10;</xsl:text>
            <!-- BMENGE/BDMNG -->
            <xsl:text>'</xsl:text>
            <xsl:value-of select="$BMENGE div ." />
            <xsl:text>',&#10;</xsl:text>
            <!-- VORNR -->
            <xsl:text>'</xsl:text>
            <xsl:value-of select="../../VORNR" />
            <xsl:text>',&#10;</xsl:text>
            <!-- BDMNG -->
            <xsl:text>'</xsl:text>
            <xsl:value-of select="." />
            <xsl:text>',&#10;</xsl:text>
            <!-- constant -->
            <xsl:text>1,&#10;GETDATE()&#10;)</xsl:text>
            <xsl:if test="position()!=last()">,</xsl:if>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

通过提供的输入,这让我:

(
'0228737A00',
'200000345',
'1',
'0011',
'16.000',
1,
GETDATE()
),
(
'0228737A01',
'200000345',
'0.9411764705882353',
'0011',
'17.000',
1,
GETDATE()
),
(
'070106293',
'200000345',
'0.3333333333333333',
'0021',
'48.000',
1,
GETDATE()
)
© www.soinside.com 2019 - 2024. All rights reserved.