如何使用 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
个后代。
我有这个 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
个后代。