仅展平复杂XML结构的深层嵌套部分
我有一个复杂的XML,它有一个标题部分和多个项目部分。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
<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结构做了一些修改,效果非常好。