XML Transformation mit lxml

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drahtesel
User
Beiträge: 2
Registriert: Montag 22. April 2013, 09:41

Hallo zusammen!

Ich habe folgendes Problem:
ich möchte ein XML mittels eines XSD transformieren. Das sieht vom Grundaufbau in etwa so aus:

Code: Alles auswählen

    parser =  etree.XMLParser(encoding='utf8')

    xml = etree.XML(open(xml_file).read(), parser)
    xsl = etree.fromstring(open(schema_file).read())
    transform = etree.XSLT(xsl)  
    result = transform(xml)
Das funktioniert soweit auch ganz gut, bis auf das Auflösen von Elementen folgender Form:

Code: Alles auswählen

<xsl:variable name="moduleType"><xsl:value-of select="fn:normalize-space(ancestor::exportData/moduleData/Modultyp)"/></xsl:variable>
Lass ich die Referenzen weg, funktioniert es. Kommentiere ich sie ein, bekomme ich ein:

lxml.etree.XSLTApplyError: XPath evaluation returned no result.

Also kann lxml die Referenz nicht auflösen oder muss ich lxml für so etwas besonders konfigurieren?

Hoffe hier kann mir jemand helfen.

Gruß, Daniel
BlackJack

@drahtesel: Ein minimales, aber lauffähiges Beispiel an dem man das Problem nachvollziehen kann, wäre praktisch.

Kannst Du die Transformation mit den beiden Dateien denn mit anderen Werkzeugen anwenden? Zum Beispiel mit ``xmlstarlet``, ``xsltproc``, ``xalan``, oder ``saxon``?
drahtesel
User
Beiträge: 2
Registriert: Montag 22. April 2013, 09:41

Ich mache hier gerade eine Portierung von Java nach Python und bei Java funktionierts mit der Standard-SAX-Library und identischen Dokumenten.

XML:
<exportData>
<moduleData>
<Modultyp>Allgemeines</Modultyp>
<Attr2>y</Attr2>
<Attr3>z</Attr3>
</moduleData>
</exportData>
Ein zugehöriges xsd würde so aussehen:

Code: Alles auswählen

<xsl:variable name="moduleType"><xsl:value-of select="fn:normalize-space(ancestor::exportData/moduleData/Modultyp)"/></xsl:variable>
<xsl:choose>
    <xsl:when test="$moduleType='Allgemeines'">
        <xsl:choose>
           # insert style informations
        
Das Problem liegt im Selektieren von Elementen im xsd.
Die Transformation erfolgt, wie auf der homepage von lxml beschrieben über:

Code: Alles auswählen

xml = etree.parse(file_path)
xsl = etree.parse(schema_file)
transform = etree.XSLT(xsl)  
result = transform(xml)
Ist ein bisschen schwierig ein Beispiel zu extrahieren, da ich riesige Dokumente geschickt bekommen habe und ich mich da noch nicht so richtig zurecht finde.
Jedenfalls meckert er beim Transformieren mit dieser oben erwähnten XPath Fehlermeldung und ich dachte es läge vielleicht auf der Hand, woran das liegt.
Antworten