In diesem Kapitel zähle ich einige Dinge auf, die ich aus verschiedenen Gründen (vor allem die begrenzte Zeit) nicht in IP4W3 implementieren konnte. Ich diskutiere aber auch Fragen, die sich bei der Benutzung vielleicht stellen, und deren mögliche Lösungen. Die einzelnen Abschnitte dieses Kapitels sind voneinander unabhängig und als Sammlung zu verstehen.
Eine Funktion, die vielleicht als erste in IP4W3 vermißt wird, ist die Suche in mehreren Dokumenten. Falls es sich bei den fraglichen Dokumenten um Instanzen von verschiedenen Dokumenttypen handelt, gibt es einen einfachen Grund dafür: Die Definition der Suchmuster und auch der Formatierungsrumpf sind untrennbar mit der DTD verbunden. Aus diesem Grund gibt es keine gemeinsamen, durch die Suchmuster definierten Kategorien, in denen die Suche stattfinden kann.
Handelt es sich jedoch um eine Sammlung von gleichartigen Dokumenten, d.h. Instanzen des selben Dokumenttyps, die gegebenenfalls auch in einem inhaltlichen Zusammenhang stehen, so ist der Wunsch nach einer Suchmöglichkeit in mehreren Dokumenten naheliegend.
Für diesen Fall braucht IP4W3 keine besondere Unterstützung anzubieten, da SGML/XML eigene Konstrukte zur Lösung dieses Problems bietet. Auf den ersten Blick ist dies eine typische Anwendung des Subdocument-Features von SGML35. Aufgrund des zuvor gesagten ist es jedoch in IP4W3 nicht notwendig oder sinnvoll, Dokumente unterschiedlicher Typen als Subdocument zu behandeln. Außerdem ist das Subdocument-Feature in XML nicht enthalten36. Das Problem kann viel einfacher durch den Entity-Mechanismus von SGML/XML gelöst werden, indem mehrere Dokumente zu einem zusammengefaßt werden. Zur Erklärung diene folgendes Beispiel.
![]() | Es sollen drei Bücher, die Instanzen des selben Dokumenttyps sind, in IP4W3 integriert werden. Die Bücher besitzen die folgenden PIDs37: "-//DEK//DOCUMENT Fundamental Algorithms//DE" "-//DEK//DOCUMENT Seminumerical Algorithms//DE" "-//DEK//DOCUMENT Sorting and Searching//DE" Der PID der zugrunde liegenden DTD sei: "-//Addison-Wesley//DTD cs professional//DE" Das Wurzelelement dieses Dokumenttyps sei buch, die Doctype-Deklaration der drei Instanzen sieht also wie folgt aus38: <!DOCTYPE buch PUBLIC "-//Addison-Wesley//DTD cs professional//DE"> |
Um diese drei Bücher nun zu einer Instanz zusammenzufassen, ist folgendes zu tun: Es muß eine DTD erstellt werden, die eine Folge von Elementen des Typs buch erlaubt und es muß eine Instanz erstellt werden, die die drei Bücher als Entities lädt.
Beide Fälle sind einfach zu handhaben. Die DTD sieht so aus39:
<!ELEMENT bibliothek - - (buch)+> <!ENTITY % buch-dtd PUBLIC "-//Addison-Wesley//DTD cs professional//DE"> %buch-dtd;
Nach dieser Definition besteht eine bibliothek einfach aus einer Folge von Büchern. Die Instanz nimmt nun folgende Form an:
<!DOCTYPE bibliothek [ <!ELEMENT bibliothek - - (buch)+> <!ENTITY % buch-dtd PUBLIC "-//Addison-Wesley//DTD cs professional//DE"> %buch-dtd; ]> <!ENTITY aocp1 PUBLIC "-//DEK//DOCUMENT Fundamental Algorithms//DE"> <!ENTITY aocp2 PUBLIC "-//DEK//DOCUMENT Seminumerical Algorithms//DE"> <!ENTITY aocp3 PUBLIC "-//DEK//DOCUMENT Sorting and Searching//DE"> <bibliothek> &aocp1; &aocp2; &aocp3; </bibliothek>
Soweit stellt die SGML-seitige Behandlung kein Problem dar. Es ist aber noch zu diskutieren, wie sich Suchmusterdefinitionen und DSSSL-Skripte verhalten, die für die Buch-DTD geschrieben wurden und nun zusammen mit der Bibliothek-DTD eingesetzt werden. In beiden Fällen sind Schwierigkeiten ausgeschlossen, die durch die Zusammenfassung der Instanzen in der beschriebenen Weise hervorgerufen werden. Der Grund besteht darin, daß sich sowohl Suchmuster als auch DSSSL-Skripte auf Elemente konzentrieren, die »unten« in der Hierarchie stehen. Im Gegensatz zu Suchmustern kann man in DSSSL zwar gezielt die Wurzel ansprechen, jedoch ist auch dadurch kein neues Problem entstanden. Vielmehr stellen sich hier Fragen, die auch bei einzelnen Instanzen auftreten. Die Diskussion wurde bereits in 5.2.4 geführt.
Abschließend kann man feststellen, daß keine Notwendigkeit besteht, eine besondere Unterstützung für die Behandlung von mehreren Dokumenten in IP4W3 vorzusehen. Die Mittel, die SGML/XML bereitstellen sind sowohl ausreichend als auch einfach genug, um in IP4W3 den Standpunkt einzunehmen, daß man grundsätzlich genau ein Dokument vor sich hat.
Die Frage, in wie weit IP4W3 konform zu den verschiedenen Standards ist, ist relativ leicht zu beantworten. Da ich für den Zugriff auf Instanzen und die Interpretation von DSSSL-Stylesheets externe Programme verwende, leitet sich die Konformität direkt aus den Eigenschaften dieser Programme ab.
Soweit es das Parsing von SGML/XML betrifft, ist in IP4W3 durch die Benutzung der Programme nsgmls und jade die bestmögliche Einhaltung der entsprechenden Standards gewährleistet (dies sind [ISO86] und [W3C98D]). Eine eigene System-Deklaration für IP4W3 ist nicht nötig; implizit verwendet das System die entsprechende Deklaration des Parsers (http://www.jclark.com/sp/sysdecl.htm).
Bei der Behandlung von Suchmustern ist darauf zu achten, daß das Programm Cost case-insensitive arbeitet. Dieses Verhalten entspricht der Reference Concrete Syntax von SGML. XML ist jedoch case-sensitive. Der Autor von Cost, Joe English, arbeitet zur Zeit an einer Aktualisierung, die XML-konform sein wird. Sofern er dabei keine Änderungen am Verhalten seines Programms einbaut, sollten meine Programme unmittelbar lauffähig sein.
Als DSSSL-Maschine verwende ich Jade. Der Programmierer James Clark ist auch der Verfasser der DSSSL-Spezifikation [ISO96B], so daß man auch hier von Einhaltung des Standards ausgehen kann. Allerdings ist Jade keine vollständige Implementierung. Ausführlich ist dies in der Dokumentation nachzulesen [CLAR98B]. Insbesondere fehlt die Transformationssprache. Clark hat als Ersatz einige neue Flow Objects definiert, von denen ich bei der Transformation in HTML Gebrauch mache.
Bei der Web-Übertragung ist der Server für die Einhaltung des Protokolls (HTTP) verantwortlich. Der von IP4W3 ausgegebene HTTP-Kopf (Content-type) ist HTTP-1.0-konform und meine Skripte halten sich an die CGI-Konvention. Sie sind daher mit jedem Web-Server lauffähig, der CGI beherrscht.
Die Persistenz von URLs ist von Bedeutung, wenn man eine Verknüpfung (Link) zu einer Seite herstellen möchte, die von IP4W3 generiert wurde. Auf die grundsätzliche Problematik der Namen und Adressen möchte ich hier nicht eingehen. Dazu empfehle ich den Aufsatz »The Myth of Names and Addresses« von Tim Berners-Lee [BERN96A].
IP4W3 führt keine mutwillige Änderung von URLs durch. Das heißt, wenn das System keine Veränderung von außen erfährt, sind die von IP4W3 erzeugten URLs auch in Zukunft gültig. Zwei Probleme gibt es aber:
Als zulässige Wertebereiche in Textfeldern von Formularen habe ich beliebig, buchstaben und posinteger zugelassen. Ich verstehe diese Bereiche nur als exemplarische Implementation, da sich in der späteren Anwendung herausstellen muß, welche Wertebereiche tatsächlich benötigt werden. Aus diesem Grund habe ich auf eine einfache Erweiterbarkeit geachtet. Sollte also Bedarf für weitere Wertebereiche bestehen, so sind folgende Änderungen durchzuführen.
Um eine Druckausgabe mit IP4W3 zu realisieren, muß zu jedem Dokument ein passender DSSSL-Rahmen vorhanden sein. Dies ist eine Anforderung an den Administrator, nicht an das System. IP4W3 muß dem Benutzer erlauben, ein anderes Ausgabeformat als HTML, z.B. RTF, PostScript usw., zu wählen. Hierfür bietet es sich an, ein Formularelement zur Auswahl vom DSSSL-Rahmen ausgeben zu lassen (format.dsssl). Das ausgewählte Format muß vom CGI-Skript (preview.pl) erkannt und beim Zusammensetzen des Rahmens und des Rumpfes berücksichtigt werden.
Wie in der Einleitung beschrieben, habe ich den Hypertextansatz in IP4W3 zurückgestellt, um stattdessen ein Dokument aus Ausschnitten zusammenzusetzen. Ich möchte nun nicht den grundsätzlichen Ansatz in Frage stellen. Die Überschrift dieses Abschnitts erweckt vielleicht den Eindruck einer Grundsatzdiskussion über das Konzept des Hypertextes. Zweifellos sind die Ideen in der Tradition von Bush [BUSH45], Engelbart (z.B. [ENGE62]) und Nelson (Xanadu-Projekt) noch längst nicht angemessen realisiert, jedoch ist hier nicht der Platz, sie zu diskutieren. Vielmehr möchte ich an dieser Stelle auf einige offene Fragen hinweisen, die sich in Verbindung von IP4W3 mit der (bescheideneren) Form des Hypertextes stellen, die heute im World Wide Web Realität ist oder in Kürze sein wird.
IP4W3 wurde mit der Idee entworfen, daß das System im Rahmen einer weiteren Diplomarbeit ergänzt wird, um aus dem Verhalten des/der Benutzer zu lernen. Bei der dadurch zu erzielenden Verbesserung kann es sich zum Beispiel darum handeln, welche Treffer zu einer Suchanfrage in welcher Reihenfolge zurückgeliefert werden. Treffer, die in der Vergangenheit als »richtige« Treffer angesehen wurden, könnten bei einer neuen Suchanfrage als erste in der Trefferliste erscheinen. Eine weitere Verbesserung betrifft die Ermittlung der Atome. Es ist nicht ausgeschlossen, daß die auf Grundlage der DTD definierten Atome nicht bei allen Instanzen der DTD für optimale Ergebnisse sorgen. Der Benutzer wird dies dadurch kompensieren, daß er die gelieferten Atome verwirft oder den Ausschnitt vergrößert. Dieses Verhalten kann benutzt werden, um bei der nächsten Suche »bessere« Atome zurückzuliefern. Letzlich kann man die genannten Ansätze auf jeden Benutzer individuell anwenden oder man kann die Menge aller Benutzer gemeinsam behandeln. Dahinter stünde die Annahme, daß zwei verschiedene Benutzer die gleichen Wünsche bezüglich der Trefferliste und der Atome haben.
Ich möchte hier zwei Punkte besprechen, die zur technischen Umsetzung nötig sind:
Konzeptionell unterscheide ich zwischen Suchmustern und Atomen. In der Implementierung werden Atome jedoch direkt aus Suchmustern abgeleitet. Die Praxis muß zeigen, ob ein komplexerer Atombegriff notwendig ist und ob dieser dann von den Suchmustern abweicht, oder ob diese mitwachsen.
Ein Beispiel für die Differenzierung beider Begriffe sei genannt: Es soll in einer Sammlung von Briefen die Suche nach dem Namen des Adressaten möglich sein. Das Resultat einer Suche soll aber weder der Name noch die Adresse des Empfängers sein, sondern der Brieftext, der an ihn geschickt wurde. Die Struktur eines Briefes sehe so aus:
<brief> <absender>...</absender> <adressat>...</adressat> <text>...</text> </brief>
Das Suchmuster zu definieren, ist problemlos möglich. Jedoch ist das gewünschte zugehörige Atom (text) kein Nachfahre und auch kein Vorfahre des Suchmusters, so daß es in der Suchmuster-Definition gar nicht vorkommt.
Ob dieses Szenario realistisch ist und ob es wirklich ein Problem darstellt, ist sicher diskussionswürdig. Eine naheliegende Lösung für das Beispiel wäre es sicher, den gesamten Brief als Ergebnis zurückzuliefern. Es ist nicht ganz unwahrscheinlich, daß der Benutzer von einem Suchergebnis verwirrt wäre, in dem der Suchbegriff gar nicht vorkommt. Die Verknüpfung beider Konzepte über den Suchvorgang in IP4W3 spricht nach meiner Auffassung gegen eine Trennung von Suchmustern und Atomen. Die Situation könnte sich ändern, sobald Web-Browser die neuen, erweiterten Hyperlinks XLink und XPointer unterstützen. Mit XPointern lassen sich Dokumentstellen ähnlich adressieren, wie es momentan implizit durch Atome in IP4W3 geschieht. Mit einer Unterstützung durch die Browser könnte der Suchvorgang von IP4W3 in Zukunft Hyperlinks (verschiedene Ausprägungen von XLinks) als Ergebnis liefern, wobei die Atome als XPointer realisiert wären. Diese Idee bietet einen Ansatz, IP4W3 mit einem Hypertextkonzept zu verbinden.
Als konkreten Einstieg möchte ich mit der folgenden Tabelle noch zeigen, wie IP4W3-Atome (als Suchmuster ausgedrückt) in XPointer umgewandelt werden können. Die Abbildung ist nicht vollständig, da ich mich auf die Struktur beschränkt habe. Daher habe ich nur Elemente ohne ihre Attribute betrachtet. Elemente lassen sich mit einem Tiefendurchlauf mit CoST transformieren. Jedesmal, wenn ein Element abgearbeitet ist, d.h. bei Erreichen des End-Tags, findet eine Ausgabe gemäß der Tabelle 4 statt.
| Zugehöriger Start-Tag | XPointer-Ausdruck | Bemerkung |
|---|---|---|
| <target-element type="zieltyp"> | origin().child(1). ancestor(1,zieltyp) | Die umständliche Überprüfung, ob das aktuelle Element (origin) vom richtigen Typ ist, ist notwendig, weil es keinen direkten Weg im aktuellen XPointer-Entwurf gibt. Aus diesem Grund muß man prüfen, ob das erste Kind (das es zu jedem target-element gibt; z.B. beschreibung) einen unmittelbaren Vorfahren des richtigen Typs hat. |
| <any> | ancestor(all) | Wählt alle Vorfahren in aufsteigender Reihenfolge aus. |
| <element type="zieltyp"> | ancestor(1,zieltyp) | Prüft, ob der direkte Vorfahre vom Typ zieltyp ist. |
Alle Elementtypen der Suchmuster-DTD, die nicht in der Tabelle aufgeführt sind, können bei der Umwandlung ignoriert werden (abgesehen von attribute, wie oben erwähnt), da sie keinerlei Bedeutung für das Atom haben.
| 35 | Zum Verständnis siehe Annex C.3.2 aus [ISO86], auch zu finden in [GOLD90], Seite 89. |
| 36 | Die SGML-Deklaration für XML enthält den Eintrag SUBDOC NO [CLAR97]. |
| 37 | Es handelt sich um fiktive PIDs für Donald E. Knuth' Serie »The Art of Computer Programming«. Es ist nicht unwahrscheinlich, daß Knuth seine Bücher nicht in SGML/XML geschrieben hat. Insofern ist das Beispiel ein weniger gutes. |
| 38 | Auf den System-Bezeichner verzichte ich in diesem Beispiel. Formal handelt es sich also nur um eine gültige SGML-Doctype-Deklaration. Um XML-Konformität zu erzielen muß ein System-Bezeichner ergänzt werden. |
| 39 | Auch hier handelt es sich um die SGML-Syntax gemäß Reference Concrete Syntax [ISO86]. Um XML-konform zu sein, muß auf die Markup-Minimierung (- -) verzichtet werden. In der nachfolgenden Instanz muß noch die XML-Deklaration ergänzt werden. |
| 40 | SGML: Der [145] declared value ist eine [68] name token group; XML: Der [54] AttType ist eine [59] Enumeration |
