Halihallo Simon und Thomas
Tja, genau das ist ja der springende Punkt: das Inhaltsverzeichnis. Natürlich kann man in XSLT durch Baumstrukturen wandern - aber die Frage ist: wie erstellt man diese in XSLT? In seiner XML-Datei sind die Klassen untereinander aufgelistet und im Enddokument sollen sie hierarchisch dargestellt werden. Als Verbindung dient nur das extends-Attribut. Mir fällt da jetzt auch auf Anhieb keine Lösung ein.
Genau das ist mein Problem. Ich habe noch darüber nachgedacht. Die Verbindung stellt das
extends-Attribut dar, welches als "Foreign Key" (wenn ich das mal so als Analogie
verwenden darf) für eine andere Klasse dient und dessen name-Attribut entspricht. Wenn
man jetzt einen Tree der Vererbungen realisieren möchte, müsste man von diesem @extends
auf die Node der referenzierten Klasse springen und dort das selbe Verfahren iterierend
verwenden. Jetzt ist die Frage, wie man mit XSLT diese Rekursion (das wiederverwendbare
Schema auf referenzierte Knoten anwenden) erstellen kann. Konkreter würde dies so
aussehen:
Input.xml
<component>
<class name="v1" />
<class name="v2" extends="v1"/>
<class name="v3" extends="v2"/>
<class name="v21" extends="v1"/>
<class name="v31" extends="v21"/>
</component>
Ausgabe.txt sollte etwa so aussehen:
Klasse v1
|
+-- Klasse v2
| |
| +-- Klasse v3
|
+-- Klasse v21
|
+-- Klasse v31
pseudo transform.example.xslt
<xsl:template name="vererbung">
<xsl:value-of select="@extends" />
<xsl:if test="@extends">
<xsl:if test="/component/class/@name = ./@extends">
<xsl:call-template name="vererbung" on="/component/class/@name = ./@extends"/>
</xsl:if>
</xsl:if>
</xsl:template>
das on="..." würde dann einem Selektieren des "Zielbaumes"[1] entsprechen, von wo aus
weitertransformiert werden würde und somit die Rekursion eingeleitet wird, bis in
@extends nichts mehr steht. Die grosse Frage ist: Wie kann man mit XSLT in dem Eingabe-
Baum durch die Knoten des DOM springen? - Die Antwort lautet meiner Meinung nach: Geht
nicht. Deshalb habe ich geschrieben, dass ich mich gerne vom Gegenteil überzeugen lasse,
bzw. für andere Lösungsvorschläge dankbar wäre; kann ja sein, dass ich von einem völlig
falschen Grundkonzept ausgehe und es ganz anders zu machen wäre mit den Mitteln von
XSLT, nur: mir fällt keine ein. Zudem, was ich da oben an Beispiel für eine XSLT ge-
schrieben habe, würde auch nicht ganz dem Ausgabe.txt entsprechen (mal von der Syntax
abgesehen), da der Baum nur für eine Klasse erstellt werden würde und somit eine ganz
einfache Syntax hätte (z. B. v1->v2->v3). Was für eine Klassenübersicht sinnvoll wäre
ist, ein Baum, der alle Klassenvererbungen abbildet und die gleichen Klassen
zusammenfassen würde. Hat jemand eine Idee, wie sich dies realisieren lassen würde?
[1] des Inputs, nicht in den Transformationsregeln und Node des XSLT-Sheets.
Viele Grüsse
Philipp