Рассмотрим XSLT , язык специального назначения, предназначенный для преобразования XML файлов и избежания каких-либо процедурных XML отображений на уровне общего назначения в данном случае Python. Хотя встроенный модуль Python, etree
, не поддерживает XSLT, это сторонний модуль, lxml
поддерживает XSLT 1.0 и полный XPath 1.0.
В качестве альтернативы, Python вызовите любой внешний XSLT 1.0 - 3.0 процессор , такой как Saxon или Xalan, или даже используйте любой другой язык общего назначения для запуска преобразования XSLT (т. Е. Java, Javascript, C#, C ++, PHP, Perl, R, VB), поскольку каждый из них несет свои собственные библиотеки XSLT.
Расширение вашего примера для представления первых трех Python и XSLT Пользователи золотых значков StackOverflow, XSLT могут легко дублировать необходимые узлы, используя несколько шаблонных режимов.
XSLT (сохранить как файл .xsl, специальный. xml файл)
<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>
Ввод XML
<?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>
Python (нет for
l oop или if
logi c)
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)
Выход XML
<?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>