XML / XSL Expertenfrage



  • Ich möchte mittels XSL ein XML-Format in ein anderes transformieren. Normalerweise ist das auch kein Problem, jedoch gibt es in diesem Fall eine Art "Referenz" von einem Element auf ein anderes. Nun würde ich gerne wissen ob es mit XSL überhaupt möglich ist, "Referenzen" mit zu transofmieren.

    Ich habe folgendes XML Format:

    <database>
    <table>
      <name>Person</name>
      <fields>
        <field>id</field>
        <field>vorname</field>
        <field>name</field>
      </fields>
    </table>
    
    <table>
      <name>Mitarbeiter</name>
      <base-table>Person</base-table>
      <fields>
        <field>personalnr</field>
        <field>gehalt</field>
      </fields>
    </table>
    </database>
    

    und möchte daraus folgendes denormalisiertes Schema generieren(Sinn und Zweck sei mal dahin gestellt), man könnte es auch auf Klassen und ähnliches anwenden. Es geht vielmehr um das Problem mit Refernzen von einem Element auf ein anderes.

    <database>
    <table>
      <name>Mitarbeiter</name>
      <fields>
        <field>id</field>
        <field>vorname</field>
        <field>name</field>
        <field>personalnr</field>
        <field>gehalt</field>
      </fields>
    </table>
    </database>
    

    :xmas2: Danke und frohes Fest! :xmas1:



  • Was ist die Referenz?
    database/table[2]/base-table -> database/table[1]/name?
    database/table[2]/fields/field[1] -> database/table[1]/fields/field[1]
    So oder so, wahrscheinlich interessiert dich das hier:
    http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm#position_bedingungen



  • Danke!

    minhen schrieb:

    Was ist die Referenz?
    database/table[2]/base-table -> database/table[1]/name?

    Genau! Mein Problem ist aber, dass ich die Position der Elemente vorher nicht kenne bzw. die Reihenfolge immer mal anders sein kann. Sprich der Transformer muss zur Laufzeit gucken, ob es ein Element ein Base base-table Element hat und falls ja, dann alle Attribut aus dem referenzierten table Element holen, wo table/name = table/base-table/.

    BTW: Danke für den Link. Auf anhieb zwar nicht das gewüschte gefunden, aber ich werde nochmal genauer schauen.



  • musst deinen kleinen finger so hoch wie möglich in die luft strecken, denn je höher, desto mehr experte biste 😮 😮



  • XSLT schrieb:

    Genau! Mein Problem ist aber, dass ich die Position der Elemente vorher nicht kenne bzw. die Reihenfolge immer mal anders sein kann. Sprich der Transformer muss zur Laufzeit gucken, ob es ein Element ein Base base-table Element hat und falls ja, dann alle Attribut aus dem referenzierten table Element holen, wo table/name = table/base-table/.

    Na dann schreib doch genau das einfach hin 😉

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="utf-8"/>
    
    <xsl:template match="database">
    	<database>
    		<xsl:for-each select="table/base-table">
    			<table>
    				<name><xsl:value-of select="../name"/></name>
    				<fields>
    					<xsl:variable name="ref"><xsl:value-of select="."/></xsl:variable>
    					<xsl:for-each select="/database/table/fields[preceding-sibling::name = $ref]/field">
    						<field><xsl:value-of select="."/></field>
    					</xsl:for-each>
    					<xsl:for-each select="../fields/field">
    						<field><xsl:value-of select="."/></field>
    					</xsl:for-each>
    				</fields>
    			</table>
    		</xsl:for-each>
    	</database>
    </xsl:template>
    
    </xsl:stylesheet>
    

    Alles halb so schlimm :xmas1:


Anmelden zum Antworten