Seite 1 von 1

XML Transformation mit lxml

Verfasst: Montag 22. April 2013, 09:56
von drahtesel
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

Re: XML Transformation mit lxml

Verfasst: Montag 22. April 2013, 10:07
von 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``?

Re: XML Transformation mit lxml

Verfasst: Montag 22. April 2013, 10:47
von drahtesel
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.