将多级元素XML转移到一级

Transfer multilevel element XML to one level

我有一个包含多个项目的 xml,它们是多级 BOM(在示例中为 2 个项目,均具有三个级别)。我需要将其转换为 xml 每个记录只有父亲和孩子(每个项目的第一条记录没有父亲)。 我们使用 XSLT 1.0,我们不能使用 Muenchian 分组,因为使用的处理器不知道关键函数。 我希望有人能帮助我。

XML 示例:

            <Items>
               <level01>
                <itemcode>L100</itemcode>
                <quantity>1</quantity>
                <whs>30</whs>
                <level02>
                    <row>
                        <itemcode>L201</itemcode>
                        <quantity>5</quantity>
                        <whs>02</whs>
                    </row>
                    <row>
                        <itemcode>L202</itemcode>
                        <quantity>8</quantity>
                        <whs>01</whs>
                    </row>
                    <row>
                        <itemcode>L203</itemcode>
                        <quantity>1</quantity>
                        <whs>01</whs>
                        <level03>
                            <row>
                                <itemcode>L301</itemcode>
                                <quantity>1</quantity>
                                <whs>01</whs>
                            </row>
                            <row>
                                <itemcode>L302</itemcode>
                                <quantity>1</quantity>
                                <whs>01</whs>
                            </row>
                        </level03>
                    </row>
                </level02>
            </level01>
            <level01>
                <itemcode>M100</itemcode>
                <quantity>1</quantity>
                <whs>30</whs>
                <level02>
                    <row>
                        <itemcode>M201</itemcode>
                        <quantity>3</quantity>
                        <whs>01</whs>
                    </row>
                    <row>
                        <itemcode>M202</itemcode>
                        <quantity>2</quantity>
                        <whs>01</whs>
                    </row>
                    <row>
                        <itemcode>M203</itemcode>
                        <quantity>2</quantity>
                        <whs>01</whs>
                        <level03>
                            <row>
                                <itemcode>M301</itemcode>
                                <quantity>1</quantity>
                                <whs>01</whs>
                            </row>
                            <row>
                                <itemcode>M302</itemcode>
                                <quantity>1</quantity>
                                <whs>01</whs>
                            </row>
                        </level03>
                    </row>
                </level02>
            </level01>
          </Items>

期望的结果:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item>
        <itemcode>L100</itemcode>
        <quantity>1</quantity>
        <whs>02</whs>
    </Item> 
    <Item>
        <father>L100</father>
        <itemcode>L201</itemcode>
        <quantity>5</quantity>
        <whs>02</whs>
    </Item> 
    <item>
        <father>L100</father>
        <itemcode>L202</itemcode>
        <quantity>8</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>L100</father>
        <itemcode>L203</itemcode>
        <quantity>1</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>L203</father>
        <itemcode>L301</itemcode>
        <quantity>1</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>L203</father>
        <itemcode>L302</itemcode>
        <quantity>1</quantity>
        <whs>01</whs>
    </item>
</Items>
<Items>
    <item>
        <itemcode>M100</itemcode>
        <quantity>1</quantity>
        <whs>02</whs>
    </item>
    <item>
        <father>M100</father>
        <itemcode>M201</itemcode>
        <quantity>3</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>M100</father>
        <itemcode>M202</itemcode>
        <quantity>2</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>M100</father>
        <itemcode>M203</itemcode>
        <quantity>2</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>M203</father>
        <itemcode>M301</itemcode>
        <quantity>1</quantity>
        <whs>01</whs>
    </item>
    <item>
        <father>M203</father>
        <itemcode>M302</itemcode>
        <quantity>1</quantity>
        <whs>01</whs>
    </item>
</items>

<?bpc.pltype.out bpm.pltype=xml?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b1e="urn:com.sap.b1i.sim:b1event" xmlns:b1ie="urn:com.sap.b1i.sim:b1ievent" xmlns:b1im="urn:com.sap.b1i.sim:b1imessage" xmlns:bfa="urn:com.sap.b1i.bizprocessor:bizatoms" xmlns:exslt="http://exslt.org/common"
    xmlns:jdbc="urn:com.sap.b1i.adapter:jdbcadapter" xmlns:js="com.sap.b1i.bpc_tools.Javascript" xmlns:rev="urn:com.sap.b1i.adapter:revaadapter" xmlns:rfc="urn:sap-com:document:sap:rfc:functions" xmlns:sim="urn:com.sap.b1i.sim:entity" xmlns:utils="com.sap.b1i.bpc_tools.Utilities"
    xmlns:vpf="urn:com.sap.b1i.vplatform:entity" xmlns:xci="urn:com.sap.b1i.xcellerator:intdoc" version="1.0" exclude-result-prefixes="b1e b1ie b1im bfa jdbc js rfc utils xci vpf exslt sim rev" b1e:force="" b1ie:force="" b1im:force="" bfa:force="" jdbc:force=""
    js:force="" rfc:force="" utils:force="" xci:force="" vpf:force="" exslt:force="" sim:force="" rev:force="">
    <?prodver 1.0.0?>
    <!--<xsl:include href="../../com.sap.b1i.dev.repository/IDE/init.xsl" />-->
    <xsl:variable name="msg" select="/vpf:Msg/vpf:Body/vpf:Payload[./@Role='S']" />
    <xsl:template match="/">
        <Msg xmlns="urn:com.sap.b1i.vplatform:entity">
            <xsl:copy-of select="/vpf:Msg/@*" />
            <xsl:copy-of select="/vpf:Msg/vpf:Header" />
            <Body>
                <xsl:copy-of select="/vpf:Msg/vpf:Body/*" />
                <Payload Role="X" id="999999">
                    <xsl:call-template name="transform" />
                </Payload>
            </Body>
        </Msg>
    </xsl:template>
        <xsl:template name="transform">

This is the space we usually add our code

    </xsl:template>
    </xsl:stylesheet>

正如我在评论中提到的,我认为没有必要在这里分组。唯一的麻烦是您的输入(在顶层没有 row 包装器)和输出(没有父项的项目没有 father 元素)的不规则性。否则这可能会更简单。

XSLT 1.0

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

<xsl:template match="/Items">
    <xsl:copy>
        <xsl:apply-templates select="level01"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="level01">
    <Item>
        <xsl:copy-of select="itemcode|quantity|whs"/>
    </Item> 
    <xsl:apply-templates select="*/row"/>
</xsl:template>

<xsl:template match="row">
    <Item>
        <father>
            <xsl:value-of select="(ancestor::*/itemcode)[last()]"/>
        </father>
        <xsl:copy-of select="itemcode|quantity|whs"/>
    </Item> 
    <xsl:apply-templates select="*/row"/>
</xsl:template>

</xsl:stylesheet>

请注意,输出与您问题中的输出有些不同:Items 元素是整个输出树的根元素。否则,您将收到 XML 片段而不是格式正确的 XML 文档。

如果您想要每个主分支的附加 包装器,请将模板匹配 level01 更改为:

<xsl:template match="level01">
    <Branch>
        <Item>
            <xsl:copy-of select="itemcode|quantity|whs"/>
        </Item> 
        <xsl:apply-templates select="*/row"/>
    </Branch>
</xsl:template>