如何使用 XSLT 和 Python 将 xml 的子子元素移动到新的 xml 文件?

How to move sub child elements of xml to a new xml file using XSLT & Python?

我有这个 xml 文件 a.xml

<?xml version="1.0"?>
<TestSuite Name="DM123">
  <Group Name="TestRoot" ExecutionPolicy="AnyDeviceAnyOrder">
    <Parameters>
      <Parameter Type="Integer" Name="maxA" Value="1" />
      <Parameter Type="Integer" Name="MaxB" Value="120" />
      <Parameter Type="String" Name="MaxC" Value="integration" />
    </Parameters>
    <Children>
      <Group Name="Cam1">
        <Parameters>
           <Parameter Type="Integer" Name="maxA" Value="1" />
           <Parameter Type="Integer" Name="MaxB" Value="120" />
           <Parameter Type="String" Name="MaxC" Value="integration" />
        </Parameters>
        <Children>
          <Group Name="Field1">
            <Parameters>
              <Parameter Type="Integer" Name="maxA" Value="1" />
              <Parameter Type="Integer" Name="MaxB" Value="120" />
              <Parameter Type="String" Name="MaxC" Value="integration" />
            </Parameters>
            <Children>
              <Test Name="Test1" Namespace="TestCases">
                <Parameters>
                  <Parameter Type="Device" Name="Device">
                    <Requirements>
                      <Requirement TypeId="a76" Source="User" />
                      <Requirement TypeId="2c9" Source="User" />
                    </Requirements>
                  </Parameter>
                </Parameters>
              </Test>
            </Children>
          </Group>
          <Group Name="Field3">
            <Parameters>
              <Parameter Type="Integer" Name="maxA" Value="1" />
              <Parameter Type="Integer" Name="MaxB" Value="120" />
              <Parameter Type="String" Name="MaxC" Value="integration" />
            </Parameters>
            <Children>
              <Test Name="Test5" Namespace="TestCases">
                <Parameters>
                  <Parameter Type="Dev" Name="Dev">
                    <Requirements>
                      <Requirement TypeId="a76" Source="User" />
                      <Requirement TypeId="2c9" Source="User" />
                    </Requirements>
                  </Parameter>
                </Parameters>
              </Test>
            </Children>
          </Group>
          <Test Name="Test6" Namespace="TestCases">
            <Parameters>
              <Parameter Type="Dev" Name="Dev">
                <Requirements>
                  <Requirement TypeId="a76" Source="User" />
                  <Requirement TypeId="2c9" Source="User" />
                </Requirements>
              </Parameter>
              <Parameter Type="Integer" Name="expected amount of images" Value="10" />
            </Parameters>
          </Test>
        </Children>  
      </Group>
    </Children>
  </Group>
  <Models>
    <Model Name="DD1" />
  </Models>
</TestSuite>

我想要实现的是output.xml

<?xml version="1.0"?>
<TestSuite Name="DM123">
  <Group Name="TestRoot" ExecutionPolicy="AnyDeviceAnyOrder">
    <Parameters>
      <Parameter Type="Integer" Name="maxA" Value="1" />
      <Parameter Type="Integer" Name="MaxB" Value="120" />
      <Parameter Type="String" Name="MaxC" Value="integration" />
    </Parameters>
    <Children>
      <Test Name="Test1" Namespace="TestCases">
        <Parameters>
           <Parameter Type="Device" Name="Device">
             <Requirements>
               <Requirement TypeId="a76" Source="User" />
               <Requirement TypeId="2c9" Source="User" />
             </Requirements>
           </Parameter>
        </Parameters>
      </Test>
      <Test Name="Test5" Namespace="TestCases">
        <Parameters>
           <Parameter Type="Dev" Name="Dev">
               <Requirements>
                 <Requirement TypeId="a76" Source="User" />
                 <Requirement TypeId="2c9" Source="User" />
               </Requirements>
           </Parameter>
        </Parameters>
      </Test>
      <Test Name="Test6" Namespace="TestCases">
            <Parameters>
              <Parameter Type="Dev" Name="Dev">
                <Requirements>
                  <Requirement TypeId="a76" Source="User" />
                  <Requirement TypeId="2c9" Source="User" />
                </Requirements>
              </Parameter>
              <Parameter Type="Integer" Name="expected amount of images" Value="10" />
            </Parameters>
      </Test>
   </Children>
  </Group>
  <Models>
    <Model Name="DD1" />
  </Models>
</TestSuite>

因此,如果您在 a.xml TestRoot 组中看到,定义了一些参数,这些参数在其他子组中也是重复的。我想删除那些组和重复的参数。我只想要第一组“TestRoot”和一个包含所有测试标签和最后一个模型标签的子标签。

点击Demo

我有这个 XSLT 代码,我试过了但似乎不起作用。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="TestSuite/Group">
     <xsl:copy>
       <xsl:apply-templates select="Parameters"/>
       <xsl:apply-templates select="Children"/>
     </xsl:copy>
    </xsl:template>

    <xsl:template match="TestSuite/Group/Children">
     <xsl:copy>
       <xsl:apply-templates select="*"/>
       <xsl:apply-templates select="following-sibling::Group/Children/*"/>
     </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

谁能帮我实现 output.xml?

我想你想用

  <xsl:template match="Group[@Name = 'TestRoot']/Children">
    <xsl:copy>
      <xsl:apply-templates select=".//Test"/>
    </xsl:copy>
  </xsl:template>

连同恒等变换

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

作为基本模板。

我不确定,但是,我已经理解关于重复项的评论,上面只是选择并处理任何 test 个后代。