对密集XML文件的节点进行排序

对密集XML文件的节点进行排序,xml,vb.net,sorting,xslt,Xml,Vb.net,Sorting,Xslt,我试图对一些包含数千个节点的大型XML文件进行排序,作为我想要排序的所有节点的共同点,有一个名为“ID”的属性 此属性前面的元素类型各不相同:它可以有多个名称,如“Apt”、“CenterDrill”、“铰刀”、“圆柱体”、“块体”、“模型”、“扫描”、“圆锥体”、“探针”等。这让我弄得一团糟,弄不清一个算法,它可以进行正确的排序,而不管属性前面的名称是什么 我不想弄乱外部元素的顺序,也就是说,我希望元素“参数化铣刀”,“参数化钻头”,“刀架”,“探针笔”,“抛光机”保持相同的顺序。我想对内部元

我试图对一些包含数千个节点的大型XML文件进行排序,作为我想要排序的所有节点的共同点,有一个名为“ID”的属性

此属性前面的元素类型各不相同:它可以有多个名称,如“Apt”、“CenterDrill”、“铰刀”、“圆柱体”、“块体”、“模型”、“扫描”、“圆锥体”、“探针”等。这让我弄得一团糟,弄不清一个算法,它可以进行正确的排序,而不管属性前面的名称是什么

我不想弄乱外部元素的顺序,也就是说,我希望元素“参数化铣刀”“参数化钻头”“刀架”“探针笔”“抛光机”保持相同的顺序。我想对内部元素进行排序,如下图所示

原始XML内容:短版本(287行)


2.
碾磨
12.7
0
0
0
0
0
88.9
63.5
0
0
0
连续波
50.8
关
12.7
6.35
0
6.35
0
0
88.9
0
0
0
0
连续波
50.8
关
12.7
0
0
0
0
5.
88.9
0
0
0
0
连续波
50.8
12.7
关
12.7
2.
4.35
2.
0
0
88.9
0
0
0
0
连续波
50.8
关
-1
0
0
0
-114.3
2.
制孔
9.525
0
0
0
31
0
101.6
76.2
0
0
0
连续波
63.5
关
0.5
12
100
12
0
连续波
0
63.5
关
60
50
31
3.
3.
12
0
连续波
11.69552
关
-1
0
0
0
-127
2.
转弯
25.4
25.4
101.6
0
关
50
10
0
关
30
10
50
0
关
探查
5.00126
101.6
2.99974
101.6
0
-4144960
76.2
关
10
10
3.
50
0
-4144960
0
关
20
3.
5.
3.
8.
6.
50
0
-4144960
0
关
-1
0
0
0
-127
抛光机
38.1
0
0
0
0
0
127
101.6
0
0
0
连续波
76.2
19.05
关
20
10
0
10
0
0
127
0
0
0
0
连续波
76.2
19.05
关
10
2.
3.
2.
0
0
127
0
0
0
0
连续波
76.2
19.05
关
-1
0
0
0
-114.3
这是排序后的预期XML内容:


2.
碾磨
12.7
6.35
0
6.35
0
0
88.9
0
0
0
0
连续波
50.8
关
12.7
0
0
0
0
5.
88.9
0
0
0
0
连续波
50.8
12.7
关
12.7
2.
4.35
2.
0
0
88.9
0
0
0
0
连续波
50.8
关
12.7
0
0
0
0
0
88.9
63.5
0
0
0
连续波
50.8
关
-1
0
0
0
-114.3
2.
制孔
60
50
31
3.
3.
12
0
连续波
11.69552
关
0.5
12
100
12
0
连续波
0
63.5
关
9.525
0
0
0
31
0
101.6
76.2
0
0
0
连续波
63.5
关
-1
0
0
0
-127
2.
转弯
50
10
0
关
25.4
25.4
101.6
0
o
    XDocument doc = XDocument.Load("Original.xml");
    foreach (XElement el in doc.Root.Descendants().Where(x => x.Elements().Any(y => y.Attribute("ID") != null) && x.Ancestors().Count() >= 2))
    {
        el.ReplaceNodes(el.Elements().OrderBy(x => int.Parse(x.Attribute("ID").Value)));
    }
    doc.Save("newFile.xml");
    XElement doc = XElement.Load("Original.xml");
    foreach (XElement el in doc.Descendants().Where(x => x.Elements().Any(y => y.Attribute("ID") != null) && x.Ancestors().Count() >= 2))
    {
        el.ReplaceNodes(el.Elements().OrderBy(x => int.Parse(x.Attribute("ID").Value)));
    }
    doc.Save("newFile.xml");
<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:strip-space elements="*"/>

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

<xsl:template match="Cutter | Holder">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:sort select="@ID" data-type="number" order="ascending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>