\chapter{Web-Engineering Übungsaufgaben}

\begin{Achtung}
    Wenn du die \acs{XML}-Datei lokal öffnest, kann es sein, dass die \acs{XSLT} nicht geladen wird. Viele moderne Browser (\zB Chrome und Edge) verbieten das Laden. Umgehen kann man dies, indem man einen lokalen Server aufsetzt und die Dateien über \code{localhost} aufruft oder einen anderen Browser (\zB Firefox, Internet Explorer) installiert und nutzt.

    \textsf{\textbf{Tipp:}} Nutze folgende Befehle, um mit Python\footnote{siehe \url{https://www.python.org/}} einen lokalen Server im aktuellen Ordner über ein Terminal zu starten (der Ordner ist dann erreichbar unter \url{http://localhost:8000})
    \begin{itemize}[noitemsep]
        \item Python 3: \code{python -m http.server --cgi 8000}
        \item Python 2: \code{python -m SimpleHTTPServer 8000}
    \end{itemize}
\end{Achtung}

\begin{Hinweis}
    Es wurden nicht alle Aufgaben vollständig bearbeitet! Die Aufgaben, welche jedoch bearbeitet wurden, sollten soweit korrekt sein.
\end{Hinweis}

\section{XML, DTD und Validierung}

Konzipieren Sie eine \acs{XML}-Struktur, mit welcher Sie einen einfachen CD-Katalog abbilden können. Die Datei soll für jede erfasste CD einen Eintrag erhalten, welcher mehrere Felder enthält. Sehen Sie dafür zunächst (mindestens) die folgenden Felder vor:

\begin{itemize}[noitemsep]
    \item Titel des Albums
    \item Interpret
\end{itemize}

Erstellen Sie die zur \acs{XML}-Struktur passende \acs{DTD}!

Erstellen Sie eine \acs{XML}-Datei (mit wenigen Einträgen), welche dieser Struktur entspricht. Was passiert, wenn Sie diese Datei in einem XML-fähigen Web-Browser anzeigen?

Validieren Sie Ihre \acs{XML}-Datei gegen die \acs{DTD}! Erkennt der Validator, falls die Datei nicht wohlgeformt oder nicht gültig ist, also nicht der \acs{DTD} entspricht? \textit{Hinweis}: Die meisten Online-Validatoren erfordern, dass Ihre \acs{DTD} im Internet online zugreifbar ist. Falls Sie keinen Internet-Webspace zur Verfügung haben, wo Sie Ihre \acs{DTD} ablegen können, können Sie die \acs{DTD} in Ihre \acs{XML}-Datei direkt integrieren oder einen Offline-Validator verwenden. Beispielsweise enthält der \acs{XML}-Editor Free Editix einen solchen.

\bigskip
\lstinputlisting[language=XML,caption=XML mit DTD]{Aufgaben/2017_06_06_XML/CD_Katalog.xml}

\section{Verknüpfung der XML-Datei mit einer XSLT-Datei}

Verknüpfen Sie die \acs{XML}-Datei nun mit einer (vorläufig leeren) \acs{XSLT}-Datei und lassen Sie die Datei wiederum im Web-Browser darstellen. Was ist der Unterschied zur vorigen Ausgabe?

\bigskip
\begin{lstlisting}[caption=Ausgabe bei leerer XSLT Datei im Firefox]
    XML Parsing Error: no root element found
        Location: file:///<Dateipfad>/CD_Katalog.xsl
        Line Number 1, Column 1:
\end{lstlisting}

Da das \code{root}-Element in der \acs{XSLT}-Datei fehlt, gibt es einer Fehlermeldung.

\newpage

\section{XSLT-Datei Grundgerüst}

Füllen Sie die eben erstellte \acs{XSLT}-Datei mit dem entsprechenden obligatorischen Grundgerüst (\acs{XML}-Deklaration etc.). Lassen Sie unabhängig von der \acs{XML}-Eingabedatei eine \acs{HTML}-Datei (mit Titel und Überschrift) ausgeben.

\bigskip
\lstinputlisting[language=XML,caption=XML Datei mit XSLT Einbindung]{Aufgaben/2017_06_06_XML/CD_Katalog_Basic.xsl}


\section{XSLT-Ausgaben und rekursive Transformation}

Schreiben Sie eine Transformation, die dafür sorgt, dass alle Inhalte von \acs{XML}-Tags in der Eingabedatei (unabhängig von deren Struktur) in der Reihenfolge Ihres Auftretens in der Ausgabedatei ausgegeben werden.

\section{Ausgabe von bestimmten Feldern}

Ändern Sie die \acs{XSLT} so ab, dass nur die jeweiligen Titel der CDs ausgegeben werden.

\section{Nutzung bestimmter Felder als Attributwerte von HTML-Tags}

Sehen Sie am Anfang Ihrer \acs{XML}-Datei einen Tag \enquote{Farbe} vor und nutzen Sie diesen, um damit die Hintergrundfarbe Ihrer \acs{HTML}-Datei zu setzen. Was ist der Unterschied zur vorigen (direkten) Ausgabe von Feldern?

\section{Sortierung}

Sortieren Sie die Einträge nun nach dem (nicht angezeigten) Interpreten.

\section{Transformation abhängig von der XML-Struktur}

Erweitern Sie die Ausgabe auf alle vorhandenen Felder. Sorgen Sie dafür, dass jeder CD-Eintrag in einer neuen Zeile beginnt.

\section{Erstellen einer Tabelle aller Einträge}

Ändern Sie die \acs{XSLT} so ab, dass die CD-Liste in Tabellenform ausgegeben wird. Welches Problem kann auftreten, wenn die CD-Einträge unvollständig sind, wenn also bei einem bestimmten Eintrag nicht alle möglichen Felder (Tags) vorhanden sind?

\section{Attribute}

Erweitern Sie die CD-Datenbank um die jeweilige Musikgattung (Rock, Pop, Jazz, Klassik). Welche Möglichkeiten bieten sich hierfür an? Welche der Möglichkeiten ist sinnvoll, falls der Eintrag abhängig von der jeweiligen Musikgattung unterschiedliche Felder enthalten soll (bei Klassik beispielsweise Komponist, Werk, \ldots{} statt Titel, Interpret, \ldots)?

\section{Filterung}

Geben Sie Listen der CDs in ihrer Sammlung aus. Erstellen Sie zum einen Listen getrennt für die jeweilige Musikgattung. Erstellen Sie außerdem eine komplette Liste Ihrer CDs, bei der die Einträge in der Reihenfolge ihres Auftretens in der \acs{XML}-Datei aufgeführt sind.

\section{Rekursive und iterative Transformation}

Vergleichen Sie anhand der bisherigen Aufgaben die Verfahrensweise bei iterativer und rekursiver Transformation. In welchen Fällen haben Sie die iterative und in welchen die rekursive Transformation angewandt? Können Sie auch die jeweilige andere Verfahrensweise einsetzen? Realisieren Sie dies, soweit möglich!


\bigskip
\lstinputlisting[language=XML,caption=XML Datei mit XSLT Einbindung]{Aufgaben/2017_06_06_XML/CD_Katalog_fuer_XSLT.xml}

\lstinputlisting[language=XML,caption=XSLT Beispiel - Iterativer Ansatz]{Aufgaben/2017_06_06_XML/CD_Katalog.xsl}

\vspace{-5mm}
\begin{Achtung}[frametitle={Hinweis}]
    Der rekursive Ansatz fehlt an dieser Stelle!
\end{Achtung}
