<P>考虑<a href="https://www.w3.org/TR/xslt/all/" rel="nofollow noreferrer">XSLT</a>,用于转换XML文件的专用语言,并避免在这里使用Python的通用级别上的任何过程XML映射。Python的内置模块<code>etree</code>不支持XSLT,但它的第三方模块<a href="https://lxml.de/xpathxslt.html" rel="nofollow noreferrer">^{<cd2>}</a>支持XSLT1.0和完整的XPath1.0</p>
< P>可替代的是,Python调用任何外部的{A3},比如Saxon或Xaln,或者甚至使用任何其他通用语言来运行XSLT转换(即java、JavaScript、C++、PH++、PHP、Perl、R、VB),因为它们各自携带自己的XSLT库。p>
<p>将示例扩展到前三名<a href="https://stackoverflow.com/tags/python/info">Python</a>和<a href="https://stackoverflow.com/tags/xslt/info">XSLT</a>StackOverflow gold badge用户,XSLT可以使用多种模板模式轻松复制所需的节点</p>
<p><strong>XSLT</strong><em>(另存为.xsl文件,一个特殊的.xml文件)</em></p>
<pre><code><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Donnees_Releve">
<xsl:copy>
<xsl:apply-templates select="Classe_Temporelle" mode="t1"/>
<xsl:apply-templates select="Classe_Temporelle" mode="t2"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Classe_Temporelle" mode="t1">
<xsl:copy>
<xsl:apply-templates select="data" />
</xsl:copy>
</xsl:template>
<xsl:template match="Classe_Temporelle" mode="t2">
<Classe_Temporelle_Distributeur>
<xsl:apply-templates select="data" />
</Classe_Temporelle_Distributeur>
</xsl:template>
</xsl:stylesheet>
</code></pre>
<p><strong>输入XML</strong></p>
<pre><code><?xml version="1.0" encoding="utf-8" ?>
<filename>
<prm>
<Donnees_Releve>
<Classe_Temporelle>
<data>Martijn Pietersr</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>Alex Martelli</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>unutbu</data>
</Classe_Temporelle>
</Donnees_Releve>
<Donnees_Releve>
<Classe_Temporelle>
<data>Dimitre Novatchev</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>Martin Honnen</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>Michael Kay</data>
</Classe_Temporelle>
</Donnees_Releve>
</prm>
</filename>
</code></pre>
<p><strong>Python</strong><em>(无<code>for</code>循环或<code>if</code>逻辑)</em></p>
<pre><code>import lxml.etree as et
# INPUT XML AND XSL SOURCES
xml = et.parse('Input.xml')
xsl = et.parse('Script.xsl')
# RUN TRANSFORMATION
transformer = et.XSLT(xsl)
new_xml = transformer(xml)
# PRINT TO CONSOLE
print(new_xml)
# SAVE TO FILE
with open('Output.xml', 'wb') as f:
f.write(new_xml)
</code></pre>
<p><strong>输出XML</strong></p>
<pre><code><?xml version="1.0" encoding="utf-16"?>
<filename>
<prm>
<Donnees_Releve>
<Classe_Temporelle>
<data>Martijn Pietersr</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>Alex Martelli</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>unutbu</data>
</Classe_Temporelle>
<Classe_Temporelle_Distributeur>
<data>Martijn Pietersr</data>
</Classe_Temporelle_Distributeur>
<Classe_Temporelle_Distributeur>
<data>Alex Martelli</data>
</Classe_Temporelle_Distributeur>
<Classe_Temporelle_Distributeur>
<data>unutbu</data>
</Classe_Temporelle_Distributeur>
</Donnees_Releve>
<Donnees_Releve>
<Classe_Temporelle>
<data>Dimitre Novatchev</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>Martin Honnen</data>
</Classe_Temporelle>
<Classe_Temporelle>
<data>Michael Kay</data>
</Classe_Temporelle>
<Classe_Temporelle_Distributeur>
<data>Dimitre Novatchev</data>
</Classe_Temporelle_Distributeur>
<Classe_Temporelle_Distributeur>
<data>Martin Honnen</data>
</Classe_Temporelle_Distributeur>
<Classe_Temporelle_Distributeur>
<data>Michael Kay</data>
</Classe_Temporelle_Distributeur>
</Donnees_Releve>
</prm>
</filename>
</code></pre>
<h2><kbd><a href="https://xsltfiddle.liberty-development.net/naZXVEW/1" rel="nofollow noreferrer">Online Demo</a></kbd></h2>