In dieser Aufgabe geht es darum, kleine Fingerübungen mit XSLT zu lösen. Die Aufgaben müssen jeweils allgemeingültig gelöst werden, also für jedes XML-Dokument funktionieren. Der zu schreibende Code ist sehr kompakt (nie mehr als wenige Zeilen), aber man muss ein klein wenig experimentieren und nachdenken, bis man darauf kommt, wie die Aufgabe am einfachsten zu lösen ist. Wichtig ist, dass sich gerade bei diesen Aufgaben XPath sehr effizient einsetzen lässt, wenn man die richtigen XPaths an den richtigen Stellen benutzt. Anderfalls muss man sehr viel mehr in XSLT-Code programmieren und läuft Gefahr, sich dabei zu verzetteln.
Eine der Fingerübungen muss in beiden Richtungen programmiert werden, also einerseits ein XSLT, um aus einem beliebigen XML-Dokument die geforderte Form zu erzeugen, und andererseits ein weiteres XSLT, um von diesem erzeugten XSLT ausgehend wieder das ursprüngliche XML zu erzeugen. Dabei ist es akzeptabel, wenn sich nach diesem Roundtrip das XML ein wenig verändert hat (Whitespace Text Nodes z.B.), aber die grundlegende XPath Node Tree Struktur muss die gleiche sein wie zuvor.
Um die Aufgaben zu erleichtern, kann in allen Fällen davon ausgegangen werden, dass es sich bei der Eingabe um ein XML-Dokument ohne Namespaces handelt, was die Handhabung deutlich vereinfacht. Das Beispieldokument dient als Ausgangspunkt für alle in den einzelnen Denksportaufgaben gezeigten Resultate, aber wie gesagt muss das XSLT allgemeingültig sein (mit Ausnahme der Namespace-Unterstützung). Die Abgabe der Übung besteht darin, die erstellten Stylesheets an den Betreuer zu mailen, am besten durch Klick auf den Abgabe Übung 9 Link.
Bemerkung: Ihr dürft die Übung in Zweiergruppen lösen. Bei der Abgabe sind beide Namen zu erwähnen.
Es soll ein XSLT geschrieben werden, dass Attribute in XML-Dokumenten beseitigt. Die Attribute sollen aber nicht einfach gelöscht werden, sondern transformiert werden in Elemente, und zwar in Kinderelemente des Elementes, auf dem sie aufgetreten sind. Das Resultat der Entattributisierung zeigt die Idee, die speziellen "Attribut-Elemente" werden durch einen voranstehenden String gekennzeichnet (in diesem Fall "attribute-
", dies kann zwar frei gewählt werden, muss aber natürlich den Vorschriften für XML Namen gehorchen), dem der Name des Attributes folgt. Auf diese geht keine Information verloren, da sowohl der Name als auch der Wert des Attributes erhalten bleiben. Man könnte die ebenso (und aus XML-Sicht sauberer) mit einem speziellen Namespace für Attributelemente lösen, doch wir geben uns mit der String-Variante zufrieden.
Zu diesem XSLT soll ein inverses XSLT geschrieben werden, das das Resultat der Entattributisierung als Eingabe verarbeitet, und daraus wieder das Originaldokument mit Attributen rekonstruiert. Dazu muss natürlich ein wenig mit den XPath String-Funktionen hantiert werden, interessant sind hier insbesondere starts-with
und substring-after
(die Aufgabe kann aber durchaus auch mit anderen Funktionen gelöst werden).
Viele in Elemente in XML-Dokumenten haben weitere Elemente als Nachkommen (also Kinder und Kindeskinder usw.), und in dieser Aufgabe soll diese Struktur deutlich gemacht werden. Für jedes Element, das weitere Elemente als Nachkommen hat, soll die Anzahl der Nachkommen im Element als Attribut vermerkt werden. Das XML-Dokument mit Nachkommenszählern zeigt diese Idee, bei der das nachkommen
Attribut jeweils zeigt, wieviele Nachkommen das jeweilige Element hat. Für Elemente ohne Nachkommen soll dieses Attribut nicht verwendet werden.
XML-Dokumente sind Bäume und haben typischerweise eine irreguläre Struktur (natürlich immer abhängig von Schema und Instanz). In dieser Aufgabe soll diese Struktur geplättet werden, und zwar auf eine einfache Art, die mit Informationsverlust verbunden ist. Das geplättete XML-Dokument zeigt die Idee, bei der alle im Dokument vorkommenden Elemente als Sequenz in einem neuen Container-Element (geplättet
) vorkommen. Die ursprüngliche Struktur der Elemente wird dabei durch ihre Namensgebung reflektiert, der Name der geplätteten Elemente ergibt sich jeweils als Sequenz aller Namen vom Document Element hin zum jeweiligen Element (getrennt durch Hyphens). Da sich die Namensgebung an der XML-Struktur orientiert und konzeptionell beliebig lang werden kann, ist der Name am einfachsten durch die rekursive Verwendung eines Named Templates zu bestimmen, das als Rekursionskriterium die Knotenhierarchie zwischen dem aktuellen Knoten und dem Document Element verwendet.
Bei dieser einfach Plättung gehen textueller Inhalt der Elemente und die Attribute verloren. Die Attribute in die Elemente zu übernehmen wäre trivial, schwieriger wird es jedoch mit textuellem Inhalt, oder genauer gesagt mixed content, weil dieser bei einer kompletten Plättung ja in Textknoten und Elementknoten zerfallen würde. Eine mögliche Alternative wäre, Elemente mit mixed content nicht zu plätten, aber dann wäre das Resultat plötzlich wieder keine reine Sequenz von Elementen. Sollten Sie eine clevere Lösung für diese Problematik finden, so wären wir daran interessiert, Ihre Strategie und Ihre Implementierung dafür zu sehen, dieser Teil ist jedoch fakultativ.
please send comments to xml-vl@dret.net last modification on Tuesday, 13-Jun-2006 13:13:56 CEST |