仅展平复杂XML结构的深层嵌套部分

仅展平复杂XML结构的深层嵌套部分,xml,nested,xslt-1.0,Xml,Nested,Xslt 1.0,我有一个复杂的XML,它有一个标题部分和多个项目部分。XML如下所示: <Order> <OrderNumber>A</OrderNumber> <SubTotal>20.00</SubTotal> <Tax> <TaxCode>AA</TaxCode> <TaxAmount>1.00</TaxAmount> </Tax> <TotalAmou

我有一个复杂的XML,它有一个标题部分和多个项目部分。XML如下所示:

<Order>
<OrderNumber>A</OrderNumber>
<SubTotal>20.00</SubTotal>
<Tax>
    <TaxCode>AA</TaxCode>
    <TaxAmount>1.00</TaxAmount>
</Tax>
<TotalAmount>21.00</TotalAmount>
<ItemSection>
    <SectionNumber>1</SectionNumber>
    <Item>
        <Product>
            <LineNumber>10</LineNumber>
            <IsConfig>Y</IsConfig>
            <Config>
                <Product>
                    <LineNumber>10-1</LineNumber>
                    <IsConfig>Y</IsConfig>
                    <Config>
                        <Product>
                            <LineNumber>10-1-1</LineNumber>
                            <IsConfig>N</IsConfig>
                            <LineTotal>2.00</LineTotal>
                        </Product>
                        <Product>
                            <LineNumber>10-1-2</LineNumber>
                            <IsConfig>N</IsConfig>
                            <LineTotal>1.00</LineTotal>
                        </Product>
                    </Config>
                    <LineITotal>1.00</LineITotal>
                </Product>
                <Product>
                    <LineNumber>10-2</LineNumber>
                    <IsConfig>N</IsConfig>
                    <LineITotal>4.00</LineITotal>
                </Product>
            </Config>
            <LineITotal>1.00</LineITotal>
        </Product>
    </Item>
    <Item>
        <Product>
            <LineNumber>20</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
    </Item>
</ItemSection>
<ItemSection>
    <SectionNumber>2</SectionNumber>
    <Item>
        <Product>
            <LineNumber>30</LineNumber>
            <IsConfig>Y</IsConfig>
            <Config>
                <Product>
                    <LineNumber>30-1</LineNumber>
                    <IsConfig>Y</IsConfig>
                    <Config>
                        <Product>
                            <LineNumber>30-1-1</LineNumber>
                            <IsConfig>N</IsConfig>
                            <LineTotal>2.00</LineTotal>
                        </Product>
                        <Product>
                            <LineNumber>30-1-2</LineNumber>
                            <IsConfig>N</IsConfig>
                            <LineTotal>1.00</LineTotal>
                        </Product>
                    </Config>
                    <LineITotal>1.00</LineITotal>
                </Product>
                <Product>
                    <LineNumber>30-2</LineNumber>
                    <IsConfig>N</IsConfig>
                    <LineITotal>4.00</LineITotal>
                </Product>
            </Config>
            <LineITotal>1.00</LineITotal>
        </Product>
    </Item>
    <Item>
        <Product>
            <LineNumber>40</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
    </Item>
</ItemSection>

A.
20
AA
1
21
1.
10
Y
10-1
Y
10-1-1
N
2
10-1-2
N
1
1
10-2
N
4
1
20
N
1
2.
30
Y
30-1
Y
30-1-1
N
2
30-1-2
N
1
1
30-2
N
4
1
40
N
1

我需要展平结构并移动所有产品块,无论它们出现在哪个级别,并将它们移动到与项目/产品相同的级别,如下所示。在执行此操作时,我需要将IsConfig的值更改为N,并删除围绕产品的Config元素。同时,我需要复制ItemSection上面的所有元素。注意:配置/产品块可以有N个级别。结果应该是这样的:

<Order>
<OrderNumber>A</OrderNumber>
<SubTotal>10.00</SubTotal>
<Tax>
    <TaxCode>AA</TaxCode>
    <TaxAmount>1.00</TaxAmount>
</Tax>
<TotalAmount>21.00</TotalAmount>
<ItemSection>
    <SectionNumber>1</SectionNumber>
    <Item>
        <Product>
            <LineNumber>10</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
        <Product>
            <LineNumber>10-1</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
        <Product>
            <LineNumber>10-1-1</LineNumber>
            <IsConfig>N</IsConfig>
            <LineTotal>2.00</LineTotal>
        </Product>
        <Product>
            <LineNumber>10-1-2</LineNumber>
            <IsConfig>N</IsConfig>
            <LineTotal>1.00</LineTotal>
        </Product>
        <Product>
            <LineNumber>10-2</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>4.00</LineITotal>
        </Product>
    </Item>
    <Item>
        <Product>
            <LineNumber>20</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
    </Item>
</ItemSection>
<ItemSection>
    <SectionNumber>2</SectionNumber>
    <Item>
        <Product>
            <LineNumber>30</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
        <Product>
            <LineNumber>30-1</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
        <Product>
            <LineNumber>30-1-1</LineNumber>
            <IsConfig>N</IsConfig>
            <LineTotal>2.00</LineTotal>
        </Product>
        <Product>
            <LineNumber>30-1-2</LineNumber>
            <IsConfig>N</IsConfig>
            <LineTotal>1.00</LineTotal>
        </Product>
        <Product>
            <LineNumber>30-2</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>4.00</LineITotal>
        </Product>
    </Item>
    <Item>
        <Product>
            <LineNumber>40</LineNumber>
            <IsConfig>N</IsConfig>
            <LineITotal>1.00</LineITotal>
        </Product>
    </Item>
</ItemSection>

A.
10
AA
1
21
1.
10
N
1
10-1
N
1
10-1-1
N
2
10-1-2
N
1
10-2
N
4
20
N
1
2.
30
N
1
30-1
N
1
30-1-1
N
2
30-1-2
N
1
30-2
N
4
40
N
1


这是实际XML的一个简单版本——实际XML有十亿个元素,与需要移动的行号处于同一级别。我知道如何使用暴力,一个接一个地复制每个字段,并且可以使用行项目部分的递归模板,但我希望在这里得到一些更有效方法的指针。谢谢。

尝试以下样式表:

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

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Product">
        <xsl:copy>
            <xsl:apply-templates select="*[not(self::Config)]"/>
        </xsl:copy>
        <xsl:apply-templates select="Config"/>
    </xsl:template>

    <xsl:template match="Config">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>


输出与您的要求一样精确。

Joel,您是老板。这正是我所需要的——我为更大的XML结构做了一些修改,效果非常好。