![]() |
Comelio GmbH
|
Comelio-Blog > XML Schema > Element-Benennung Bedeutung der Benennung für XSLT
XML Schema und XSLT: Bedeutung der Namensgebung von XML-ElementenDie Überlegungen dieses Artikels führen letztendlich dazu, Änderungen an der Modellierung vorzunehmen, um eine spezielle Technik der Verarbeitung vorzunehmen. Dies mag auf den ersten Blick so klingen, als wollte man den Bock zum Gärtner machen und nun die Daten von der Art ihrer Verarbeitung abhängig machen. Dies ist nämlich ein Vorgehen, das möglicherweise die Unabhängigkeit der Daten von ihrer Verarbeitung irreparabel schädigt. Wir werden allerdings keinesfalls solche Ideen vorbringen, die dazu führen könnten, beispielsweise Datenredundanzen einzurichten, weil man nachher »so schön auf die Daten zugreifen kann«. Unsere Vorschläge sollen mehr dazu führen, nicht nur für die Verarbeitung, sondern überhaupt auch aus intrinsischen Gründen gute Modellierungen hervorzubringen. Wir sehen daher unsere Vorschläge mehr wie eine gut normalisierte Datenbank, die ja auch nicht nur deswegen in viele einzelnen Relationen aufgespalten wird, damit man die Daten bei einem Export leichter auf Disketten speichern kann, weil die Datenmenge pro Tabelle kleiner ist. GrundlagenEine der einfachsten Vereinbarungen, die zwischen Modellierer und Verarbeiter zu treffen sind, sollte die Auswahl von Bezeichnern sein, mit denen man gut arbeiten kann. Eine solche gute Arbeit kann in unseren Augen immer eine solche sein, in der man die Elementnamen wie im Einstiegsbeispiel auch sofort für die Ausgabe verwenden kann. Kryptische Namen oder Abkürzungen sollten daher unterbleiben. Folgende Gründe lassen sich für eine solche Benennungsregel finden:
Gegen solche K.O.-Argumente wie das vorletzte in Form von standardisierten Bezeichnern lässt sich eigentlich gar nichts ausrichten, weil wir selbst auch Verfechter von fertigen Standards sind, um auf die Arbeit von anderen Gruppen zurückzugreifen und die Wahrscheinlichkeit zu erhöhen, eine qualitativ hochwertige Modellierung mit geringem Arbeitseinsatz zu erreichen und später vielleicht sogar auf standardisierte Verarbeitungsweisen zurückgreifen zu können, die noch einmal den Arbeitseinsatz senken können. Bleibt zusammenfassend nur zu erwähnen, dass man sich immerhin die Frage stellen sollte, ob für das gesamte Dokument oder wenigstens für einzelne Teile geschickte Benennungen auch dazu führen können, für die Ausgabe der Daten bereits fertige Texte in der Datei vorzufinden. Bei ohnehin kleinen Datenmengen ließe sich auch im Fall einer Standardisierung überlegen, Elemente oder Attribute eines anderen Namenraumes einzufügen, die die ausgabebezogenen Daten enthalten. Alternativ ließe sich hier bei einer überschaubaren Menge an Daten auch eine Übersetzung in Form einer längeren Fallunterscheidung oder einer Parameterliste denken. BeispielDieser Abschnitt soll Ihnen zeigen, wie Sie mit geschickter Benennung dazu kommen, allgemeine Vorlagen so einzusetzen, dass die vorhandenen Namen auch gleichzeitig für die Ausgabe geeignet sind. Die einzusetzenden Funktionen sind einfach und von ihrer Anzahl her überschaubar. Bei einfachen Dokumenten lässt sich die Technik gut einsetzen. Bei Dokumenten, die komplexe Inhalte (durchschnittlicher Umsatz pro Kunde innerhalb einer Region oder allgemein auch spezialisierte Bezeichnungen innerhalb technischer, betriebswirtschaftlicher oder wissenschaftlicher Bereiche) enthalten, kann es leicht passieren, dass man innerhalb eines Namens nicht den gesamten Sachverhalt ausdrücken kann. Hier sollte man durch Verschachtelung und geeignete Eltern-Kind-Strukturen versuchen, dennoch weitestgehend gute, ausgabetaugliche Bezeichner zu finden. Unser aktuelles Beispiel enthält eine Liste mit Monaten und Tarifen sowie ihren Umsatz und ihren Pro-Kopf-Umsatz und die Kundenzahl.
<Monatsliste>
<Monat>
<Datum>01.04</Datum>
<Pro-Kopf-Umsatz>0.0251</Pro-Kopf-Umsatz>
<Kunden>25649</Kunden>
<Tarifliste>
<Tarif>
<Name>Mondschein1</Name>
<Umsatz>644.69</Umsatz>
</Tarif>
</Tarifliste>
</Monat>
...Umsatzzahlen
Wir streben eine einfache HTML-Ausgabe an, bei der die vorhandenen Namen direkt auf der HTML-Seite als Titel ausgegeben werden sollen. Die Verarbeitung ähnelt sehr dem Einführungsbeispiel. So gibt es ebenfalls eine Zuordnung von Überschriftelementen in HTML, die von der Ebene in XML abhängig sind. Die interessante Verarbeitung konzentriert sich innerhalb einer einzigen Vorlage. Die Startvorlage haben wir nicht abgedruckt, da sie lediglich den HTML-Grundbaukasten enthält und die Verarbeitung gefundener Kindknoten antreibt. Es sind insgesamt drei Fälle zu unterscheiden, wobei wir in diesem Beispiel zwei Elementnamen erkennen, die den Bestandteil liste enthalten und tatsächlich einzelne Elemente in Listenform enthalten. Dies betrifft z.B. das Element Monatsliste, das mehrere Monat-Elemente besitzt. In einer Fallunterscheidung differenzieren wir die Verarbeitung in drei Fällen. Der erste Fall erkennt solche Knoten, die den Wortbestandteil liste im Namen führen, und vergibt für sie in Abhängigkeit der Verschachtelungstiefe passende HTML-Überschriften und gibt ihren Namen als Titel aus. In der Variablen Listen-Vorfahren speichert man die Anzahl der Elemente, die auf der Vorfahren-Achse gefunden werden und ebenfalls das Wort liste enthalten. Der Wert wird benutzt, um die Überschriftenhierarchie zu ermitteln.
<xsl:template match="child::*">
<xsl:choose>
<!-- Fall 1: Name enthält "Liste" -->
<xsl:when test="contains(lower-case(local-name()), 'liste')">
<xsl:variable name="Listen-Vorfahren" select="count(ancestor::*
[contains(lower-case(local-name()), 'liste')])"/>
<!-- Zuordnung von Überschriften anhand der Listen-Vorfahren -->
<xsl:choose>
<xsl:when test="$Listen-Vorfahren = 0">
<h1>
<xsl:value-of select="local-name(.)"/>
</h1>
</xsl:when>
<xsl:when test="$Listen-Vorfahren = 1">
<h2>
<xsl:value-of select="local-name(.)"/>
</h2>
</xsl:when>
<xsl:when test="$Listen-Vorfahren > 1">
<h3>
<xsl:value-of select="local-name(.)"/>
</h3>
</xsl:when>
</xsl:choose>
<ul>
<xsl:apply-templates select="child::*"/>
</ul>
</xsl:when>Erster Fall
Im zweiten Fall geht es darum, die Kinder zu verarbeiten, die direkte Kinder von solchen Listenelementen sind. Für sie gilt, dass ihre Werte und ihr Name in einem HTML-Listenelement ausgegeben werden und ihre Kinder wiederum innerhalb des Listenpunkts verarbeitet werden.
<!-- Fall 2: Elternname enthält "Liste" -->
<xsl:when test="contains(lower-case(parent::*/local-name()), 'liste')">
<li>
<xsl:value-of select="local-name(.)"/>
<br/>
<xsl:apply-templates select="child::*"/>
</li>
</xsl:when> Zweiter Fall
In einem dritten Fall verarbeiten wir Elemente, deren Eltern nicht das Wort liste enthalten (das sind dann Kinder der Listenelemente) und die auch selbst nicht das Wort liste enthalten. Die letzte Unterscheidung ist notwendig für Listenelemente, die sich innerhalb von Kindern von Listenelementen befinden. Auch hier gibt man wieder den Namen und den Wert aus.
<!-- Fall 3: Name und Eltern-Name enthalten nicht "Liste" -->
<xsl:when test="not(contains(lower-case(parent::*/local-name()), 'liste'))
and not(contains(lower-case(local-name()), 'liste'))">
<xsl:value-of select="(local-name(.), ': ', .)"/>
<br/>
</xsl:when>
</xsl:choose>
</xsl:template>Dritter Fall
Die Ausgabe ist dieses Mal tatsächlich sehr einfach; allerdings ist das Dokument auch nicht sehr komplex. Man sieht, dass die Namen der Elemente und ihre Bedeutung als Listenelement korrekt erkannt wurden und auch die Überschriften richtig zugewiesen wurden.
Dieses Beispiel kombiniert die allgemeine Verarbeitung der Namen mit schematisierten Namenskombinationen. Dies können Präfixe oder einfach angeschlossene Namensbestandteile wie Formatierungsangaben in Form von titel oder liste oder auch Strukturen sein wie sammlung, einheit oder gruppe. Anregungen für solche zusammengesetzten Namen kann man sich leicht aus anderen XML-Vokabularen vom W3C oder Industrievereinigungen besorgen, in denen teilweise recht lange Namen erscheinen, weil oftmals bei abstrakten Konzepten keine kurzen Namen verfügbar sind.
Seminare
|
||