From: G?nther B. <br...@us...> - 2002-06-05 14:00:18
|
Update of /cvsroot/xpg-xml/doc In directory usw-pr-cvs1:/tmp/cvs-serv17625 Added Files: Kap4ff.tex Log Message: Chapter 4 ff of report / corrected --- NEW FILE: Kap4ff.tex --- \documentclass[oneside,a4paper,10pt]{book} \usepackage{german} \usepackage{isolatin1} \usepackage[dinodraft,german]{dino} \usepackage{amssymb} %\usepackage{acronym} % ---------- change paragraph layout -------------------- \parskip1.2ex % Vertikaler Abstand zwischen Absaetzen \parindent0cm % Nicht einrücken bei neuem Absatz % ---------- change name of tables -------------------- \renewcommand{\tablename}{Tabelle} \global\def\tableCaption{\tablename} % ------------------- settings for pdf documents ---------------------------- \expandafter\ifx\csname pdfoutput\endcsname\relax \else \hypersetup{backref, % pdfauthor={\ehaselwanter}, pdftitle={Seminarbericht XPG-XDML}, pdfsubject={}, % colorlinks=true, %% linkcolor=webgreen, %defined below %% filecolor=webbrown, %defined below %% citecolor=webgreen, %defined below % pdfpagemode=None, a4paper=true, % bookmarksopen=false } % %Define some eye-pleasing colors for this document % % \definecolor{webgreen}{rgb}{0,.5,0} % \definecolor{webbrown}{rgb}{.6,0,0} \fi \setcounter{page}{1} \begin{document} \chapter{Anwendungsbeispiele} \label{sec:Anwendungsbeispiele} \section{\LaTeX: flexible Handhabung ganzer Dokumentblöcke} Während der Erstellung größerer Dokumente kann es immer wieder vorkommen, dass es notwendig, ist Teile eines Dokuments umzustrukturieren und dabei ganze Blöcke des Dokuments zu verschieben. Dabei kann es passieren, dass aus einem ursprünglich eigenen Kapitel nunmehr ein Unterkapitel wird, oder umgekehrt, aus einem anfangs nur als kleines Unterkapitel gedachten Block nun ein eigenes, großes Kapitel wird. Das bedeutet aber, dass Änderungen in der Dokumentenhierarchie vorgenommen werden. Nun ist es jedoch in Textbeschreibungssprachen wie \LaTeX\ der Fall, dass diese Heirarchie eines Dokuments eine sehr genau vorgegebene Form haben muß - bei \LaTeX\ sind dies der Reihe nach {\em part, chapter, section, subsection, subsubsection, paragraph, subparagraph}. Dies bedeutet nun aber, wenn bei solchen Umstrukturierungen aus Unterkapiteln eigene Kapitel werden (und analog umgekehrt), dass diese Modifikationen der Dokumenthierarchie händisch nachgebessert werden müssen: aus einem {\em section} wird ein {\em chapter}, aus dem darin enthaltenen {\em subsection} wird ein {\em section} und gleich weiter im ganzen verschobenen Block (respektive umgekehrt wenn aus einem Kapitel ein Unterkapitel wird). Dieses händische Nachbessern wird obsolet, wenn man in der Dokumenthierarchie nur ein Element (z.B. {\em section }) kennt, unabhängig von der jeweiligen Hierarchieebene - man dieses also beliebig ineinander verschachteln kann. Aus der Tiefe dieser Verschachtelung erhält man dann die Ebene der Hierarchie für die Übersetzung in ein Zielformat (wie \LaTeX ) in dem man je Ebene einen unterschiedlichen Bezeichner hat. Eine solche Dokumentenhierarchie kann nun zum Beispiel ein Aussehen wie folgt haben: \begin{verbatim} <document> <section> <title>1. Kapitel</title> <para> ... </para> </section> <section> <title>2. Kapitel</title> <para> ... </para> <section> <title>1. Abschnitt</title> <para> ... </para> </section> <section> <title>2. Abschnitt</title> <para> ... </para> </section> </section> </document> \end{verbatim} Der eigentliche Inhalt der einzelnen Abschnitte befindet sich hier in den \texttt{<para>} Elementen, und wird entsprechend der weiters darin enthaltenen Elemente ins Zielformat übersetzt. Die \texttt{<title>} Elemente enthalten die Überschriften der einzelnen (Unter-)Kapitel. Für die \texttt{<section>} Elemente wird die jeweilige Verschachtelungstiefe akkumuliert (d.h. bei einen Starttag um eins erhöht und beim Endtag wieder um eins erniedrigt) und entsprechend dieser dann der entsprechende Bezeichner in der Zielsprache ausgewählt. Zu obigem Beispiel kann nun die dazugehörige Dokumentenhierarchie in \LaTeX\ folgendermaßen aussehen: \begin{verbatim} \begin{document} \section{1. Kapitel} ... \section{2. Kapitel} ... \subsection{1. Abschnitt} ... \subsection{2. Abschnitt} ... \end{document} \end{verbatim} \section{Rechnen} Häufig kommt es vor, dass man eine ganze Menge von Daten als Input hat, sich jedoch nicht für diese gesamte Datenflut interessiert, sondern nur ein paar davon abgeleitete Daten benötigt,womit sich dann meist besser die gewünschten Aussagen belegen lassen. Das heißt, wenn als Input zum Beispiel eine ganze Tabelle mit Meßwerten zu Verfügung steht, ist es möglich daraus zusätzlich repräsentative Werte wie Maxima/Minima, Mittelwert, die Summe oder sonstige beliebige generierbare Daten zu ermitteln und in das Enddokument einfließen zu lassen. Das bedeutet aber gleichzeitig auch, dass bei einem etwaigen Update der Inputdaten mit einem neuerlichen Übersetzen des Dokuments diese generierten Daten im Output ebenfalls automatisch upgedatet werden. Implementiert ist dies mit dem Framework in folgender Weise, dass aufgrund des Designs sämtliche Inputdaten der einzelnen \ac{ac:Xml}-Elemente im zur Datenspeicherung vorgesehenen \texttt{DataObject} (siehe \ref{sec:VerwaltungVonInputdaten}, S. \pageref{sec:VerwaltungVonInputdaten}) verwaltet werden können. Es können somit also auch ganze Tabellen oder Listen von Inputdaten dort gesammelt abgelegt werden und dann daraus die benötigten Daten - wobei dies beginnend von Extremwerten, Mittelwerten oder Summen bis hin zu ganzen statistischen Berechnungen oder Verteilungen oder beliebige andere komplizierte Berechnungen sein können - akkumuliert und entsprechend in den Output eingefügt werden. Als einfaches Beispiel für diese Funktionalität wurde eine Liste implementiert, aus deren Daten dann wahlweise der Mittelwert oder die Summe berechnet werden und abschließend jeweils der Liste angefügt werden. Das heißt, man hat wahlweise einen der folgenden Inputs: \begin{tabular}{p{1cm} l|p{.2cm} l} \\ & Beispiel A: & & Beispiel B: \\ \cline{2-4} & & & \\ & \texttt{<para>} & & \texttt{<para>} \\ & \texttt{ Liste mit Summe:} & & \texttt{ Liste mit Durchschnitt:} \\ & \texttt{</para>} & & \texttt{</para>} \\ & \texttt{<list eval=\"{}sum\"{}>} { } & & \texttt{<list eval=\"{}avg\"{}>} \\ & \texttt{ <item>3.7</item>} & & \texttt{ <item>3.7</item>} \\ & \texttt{ <item>2.8</item>} & & \texttt{ <item>2.8</item>} \\ & \texttt{ <item>13.2</item>} & & \texttt{ <item>13.2</item>} \\ & \texttt{</list>} & & \texttt{</list>} \\ \\ \end{tabular} Und daraus wird dann alternativ der folgende Output generiert: \begin{tabular}{p{1.3cm} c|p{.2cm} c} \\ & Liste mit Summe: { } & & Liste mit Durchschnitt\\ & & & \\ & 3.7 & & 3.7 \\ & 2.8 & & 2.8 \\ & 13.2 & & 13.2 \\ & & & \\ & {\bf $\sum $ 19.7} & & {\bf $\varnothing $ 6.57} \end{tabular} \section{Lebenslauf - 2 verschiedene Zielformate} Ziel dieses auf den ersten Blick relativ einfachen Anwendungsbeispiels ist es, einen Lebenslauf zu erstellen und zu übersetzen. Dazu wurde auch ein eigenes Schema entworfen, dass das Eingabeformat desselben beschreibt. Es besteht aus einem ersten Teil, welcher die gesamten persönlichen Daten wie Name, Geburtsdaten, Adresse, Telefon und dergleichen enthält und anschließend einer Reihe von Listen zu den einzelnen Themen, wie zum Beispiel Schulbildung, beruflicher Werdegang, weitere Qualifikationen und ähnlichem mehr. Außerdem sind noch als Attribute eine Bezeichnung des Lebenslaufs und eine Sprachauswahl vorgesehen. Dieser Aufbau für das Eingabeformat des Lebenslaufs wurde dadurch gewonnen, da als erstes Zielformat {\LaTeX } in Zusammenspiel mit einem speziellen \ac{ac:Cv} Style gewählt wurde. Die Übersetzung des Lebenslaufes nach {\LaTeX } wurde auch speziell auf die Verwendung dieses Styles abgestimmt. Der Lebenslauf soll nun aber auch noch in andere Zielformate (z.B. \ac{ac:Html}) übersetzt werden können. Dazu kann der Großteil der Transitionen für die Übersetzung nach \LaTeX\ wiederverwendet werden und nur jene wenige, die effektiv den Output formatieren, entsprechend adaptiert werden. Es können also, wenn einmal die Übersetzung in ein bestimmtes Format vorhanden ist, mit relativ geringem Aufwand Übersetzungen in andere Formate hinzugefügt werden. \section{Diagramme} In Geschäftsberichten, Jahresberichten, Marktanalysen, Erhebungen und noch vielen anderen Dokumenten ähnlicher Art ist es erforderlich, Diagramme verschiedenster Art (wie z.B. Kurvendiagramme, Tortendiagramme, Blockdiagramme, ...) ins gewünschte Enddokument einzufügen. Die Ausgangsbasis Stellen hier eine bestimmte Menge an Daten dar, aus welchen dann ein Diagramm beliebiger Art erstellt werden soll, um dieses anschließend in das Dokument einzubinden. Bei diesem Framework gibt es nun dahingehend eine wesentliche Erleichterung, dass es nur notwendig ist, in das Sourcedokument die gesammelten Daten für das Diagramm einzufügen, die gewünschte Art des Diagramms anzugeben und die dafür außer den Daten noch notwendigen Angaben zu machen. Beim Übesetzen in das gewünschte Zielformat wird dann automatisch das erforderliche Diagramm erstellt und in das Enddokument eingebunden. Diese komfortable Vorgehensweise erhielt man in diesem Beispiel durch das Einbinden des \texttt{Chart2D}-Packages, \cite{chart2d} mit welchem auf einfache Weise aus einer Reihe von Daten verschiedene Arten von Diagrammen erstellt werden können. Solche vom \texttt{Chart2D}-Package erstellten Graphiken werden dann im \ac{ac:Png}-Format in Files gespeichert und diese können dann recht komfortabel in den Output eingebunden werden. Der Dateninput kann beispielsweise so aussehen: \begin{verbatim} <chart> <title>Quartalsumsätze 2001</title> <list chart="pie"> <title>Quartalsumsätze</title> <item caption="1. Quartal">127</item> <item caption="2. Quartal">158</item> <item caption="3. Quartal">113</item> <item caption="4. Quartal">147</item> </list> </chart> \end{verbatim} Und dementsprechend wird dann eine Graphik wie in Abbildung \ref{fig:PieChart} in das Enddokument eingebunden. \image[0.9]{images/quartalsumsaetze}{Beispiel: generiertes Tortendiagramm}{}{fig:PieChart} \chapter{Abschließende Betrachtungen} Es sollen nun noch einmal die Möglichkeiten und Vorteile des implementierten Frameworks zusammengefasst und aufgezeigt werden, welche Erweiterungsmöglichkeiten es bietet und an welchen Punkte dazu angesetzt werden kann. \section{Zusammenfassung und Diskussion} Die vorhandenen Technologien zur Verarbeitung von \ac{ac:Xml}-Dokumenten, vorallem zur Erstellung neuer (druckbarer) Dokumente, bieten meist nicht den Funktionsumfang der in der heutigen Zeit zur professionellen Verarbeitung benötigt wird. Es wurde versucht, ein Framework zu designen und zu implementieren, welches zur allgemeinen Verarbeitung von XML-Dokumenten verwendet werden kann und leicht erweiterbar ist. Was sind nun im Einzelnen die Vorteile des implementierten Frameworks? \begin{itemize} \item {\em Die Verwendung von \ac{ac:Xml} als Format für die Inputdaten} - Damit wird sichergestellt, dass in den Inputdaten ausschließlich Information und keine Formatierung oder dergleichen enthalten ist. Trotzdem ist dies eine für Menschen lesbare Repräsentation von Daten. Zudem wird mit der geforderten Verwendung von XML-Schematas auch die Validierung der Inputdaten sichergestellt. \item {\em Strikte Trennung von Inhalt, Layout und Logik} - Durch das Design des Framework werden diese drei Schichten strikt voneinander getrennt. Dies ist einer der Hauptvorteile gegenüber Servlets, \ac{ac:Jsp} und ähnlichem. \item {\em Die Möglichkeit das selbe Dokument in verschiedene Formate zu trans\-for\-mieren} - Der Input ist vollkommen unabhängig davon, in welches Format man ihn übersetzen will. Ist jedoch einmal die Transformation in ein bestimmtes Zielformat vorhanden, so kann mit relativ geringem Aufwand auf weitere Formate erweitert werden. Dies funktioniert deshalb, weil die gesamte Ablaufsteuerung die selbe bleiben kann und nur jene Transitionen ausgetauscht werden müssen, welche effektiv Output in der Zielsprache erzeugen. \item {\em Beliebige Erweiterungsmöglichkeit mittels wiederverwendbarer Packages} - Das vorhandene Framework kann sehr einfach um eine weitere Dokumentklasse oder um ein weiteres Zielformat erweitert werden, indem man ein weiteres Package mit den dafür notwendigen Transitionen entwickelt, welches danach immer wieder verwendet werden kann. \item {\em Ermittlung neuer Daten aus den Inputdaten} - Es können nicht nur die Daten aus den Inputdateien einfach in den Output übernommen werden, sondern es können daraus auch neue Daten generiert werden, welche dann in den Output einfließen. Hierbei sind unter anderem mathematische Berechnungen, umfangreiche Statistiken und dergleichen mehr möglich. \item {\em Verwenden und Einbinden vorhandener Packages} - Es können sämtliche für beliebige Zwecke vorhandenen Java-Packages in das Framework (respektive in den Transitionen eines Erweiterungspackages zum Framework) eingebunden werden. Damit werden Funktionalitäten wie zum Beispiel das Erstellen von Diagrammen aus Rohdaten mit Hilfe des Chart2D-Packages und beliebig anderes mehr möglich. \item {\em Keine Beschränkung auf reine Dokumente als Output} - Das Framework kann nicht nur die Transformation von \ac{ac:Xml}-Doku\-menten in andere Dokumentenformate bewerkstelligen, sondern es ist noch weit mehr an Funktionalität damit erzielbar. Ein konkretes Beispiel hierfür ist bereits im Framework selbst inkludiert: das Aufsetzten einer neuen Statemachine. \end{itemize} \section{Ausblick} Es gibt nun allerdings noch einige Punkte, an denen man ansetzen kann, um das vorhandene Framework zu erweitern und zu verbessern. \begin{itemize} \item {\em Entwicklung eines graphischen Interfaces} - Die derzeitige \texttt{main} Methode ersetzend, welche nur eine eingabe auf der Kommandozeile zuläßt, kann ein \ac{ac:Gui} als Erweiterung zum bestehenden Framework implementiert werden, um das Arbeiten mit demselben komfortabler zu gestalten. Es ist zu diesem Zwecke allerdings nicht mehr erforderlich, den vorhandenen Systemkern zu verändern. \item {\em Automatisches Generieren der Konfigurationsdaten einer Statemachine aus dem Schema der zu verarbeitenden Dokumentklasse} - Derzeit müssen sowohl das Schema einer zu verarbeitenden Dokumentklasse als auch das dazugehörige Konfigurationsfile zum Aufbauen der dafür notwendigen Statemachine separat und von Hand geschrieben werden. Eine Technik wie aus dem Schema automatisch die Konfiguration der Statemachine ermittelt werden kann wurde noch nicht entwickelt. \item {\em Anbindung von Datenbanken an Dokumente} - Es sollte eine Möglichkeit geschaffen werden, dass beim Übersetzen spezieller Sourcedokumente auch die Verbindung zu Datenbanken geschaffen wird, aus welchen dann Daten für das gewünschte Enddokument extrahiert werden können. \item {\em Erstellen und Verwalten von Bibliographien und Literaturverzeichnissen} - Zu großen wissenschaftlichen Arbeiten ist es üblich, Bibliographien und Literaturverzeichnisse anzugeben. In \LaTeX\ existiert hierzu ein recht komfortables Packages: {\em BibTeX}. Eine ähnliche Funktionalität könnte dem Framework hinzugefügt werden. Aus einer separaten Quelle sollen Daten für Literaturverzeichnis und Bibliographie zum Sourcedokument gewonnen werden und ins Enddokument eingebunden werden können. Beim Übersetzen nach \LaTeX\ könnte man dann wieder auf das {\em BibTeX }-Package zurückgreifen. \item {\em Templates für Web-Formulare} - Ein gängiges Problem in der Webseitengestaltung bzw. Programmierung ist das Verarbeiten von Daten, die vom User eingegeben werden. Für dieses Problem sollte ein genereller Ansatz geschaffen werden, da die Abläufe immer dieselben sind und sich nur die Repräsentation und die verwendeten Daten ändern. Das Framework sollte nun dahingehend verwendbar sein, dass es für die jeweiligen Projekte bzw. Webseiten nur noch eine Datenbeschreibung in einer geeigneten Form benötigt. Der Grafiker kann dazu parallel Templates entwerfen, in die per Platzhalter die Datenfelder eingefügt werden können. \\ Eine geeignete Lösung wäre dafür, die Datenfelder in einem geeigneten Format (XML bzw. XML Schema bieten sich an) zu beschreiben und die Erzeugung der eigentlichen Web Formulare passiert automatisiert. Es kann dies eine Umwandlung von XML in PHP sein; Es wäre jedoch leicht möglich, auch z. B. JSP oder ASP damit zu erzeugen. \item {\em Erweiterung des Frameworks zu wiederverwendbarer Middleware} - Es kann das vorhandene Framework soweit erweitert werden, dass es im Zusammenhang mit verschiedenen Frontends und Backends Verwendung findet. Das bedeutet, dass man es zu Middleware erweitert. \item {\em Einsatz des Frameworks als Servlet} - Es wäre möglich, das vorhandene Framework dahingehend zu erweitern, dass es als Web-Applikation auf einem Servlet-Server (z.B. Apache) läuft und somit die \ac{ac:Xml} Dokumente im Internet zu Verfügung stellt. Zusätzlich dazu, dass diese Dokumente immer aktuell sind, da sie ja erst beim entsprechenden Request generiert werden, wäre auch eine Auswahlmöglichkeit des gewünschten Dokumentformats (z.B. \ac{ac:Html} oder \ac{ac:Pdf}) möglich. \end{itemize} Es besitzt das vorhandene System nun bereits eine vielseitige Funktionalität, kann aber auch noch in viele Richtungen hin erweitert und verbessert werden. Das Design dieses Framework bietet also eine Unmenge an Möglichkeiten. \appendix \addcontentsline{toc}{chapter}{\bibname} \setbookmark[section]{\bibname} % \chapter{Literaturverzeichnis} \bibliographystyle{abbrv} \bibliography{Seminarbericht,bibliography_entries,script,rfc_wo_cite,std,fyi} \chapter{Schema der Statemachine} \label{sec:SchemaDerStatemaschine} \footnotesize \begin{verbatim} <?xml version="1.0" standalone="no"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- attention: all names must be adapted to the following nameing convention type names : AllWordsCapitalizedWithoutUnderscores element names : alllowercasewithoutunderscores --> <xsd:element name="statemachine"> <xsd:complexType> <xsd:sequence> <xsd:element name="path" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> <xsd:element name="states" type="States" minOccurs="1" maxOccurs="1"/> <xsd:element name="transitions" type="Transitions" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="States"> <xsd:sequence> <xsd:element name="startstate" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="state" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Transitions"> <xsd:sequence> <xsd:element name="transition" type="Transition" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Transition"> <xsd:sequence> <xsd:element name="beginstate" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="nextstate" type="xsd:string" minOccurs="1" maxOccurs="1"/> <xsd:element name="element" minOccurs="0" maxOccurs="1"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="type" type="ElementAttributes" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <xsd:element name="classname" type="xsd:string" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="ElementAttributes"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="start"/> <xsd:enumeration value="end"/> <xsd:enumeration value="enddoc"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> \end{verbatim} \normalsize \end{document} |