\item jede \acs{XML}-Datei muss/sollte wohlgeformt und gültig sein!
\textit{Wohlgeformtheit:}
\begin{itemize}[noitemsep]
\item Tags immer paarweise, \dash zu jedem Start-Tag gibt es das passende End-Tag
\item korrekte Schachtelung der Tags, \dash das zuletzt geöffnete und noch nicht geschlossene Tag muss als erstes geschlossen werden.
\item Es gibt genau einen \enquote{Wurzeltag}/\enquote{root-Tag}, \dash genau ein Tag auf oberster Ebene welches das gesamte restliche Dokument enthält.
\item[$\Rightarrow$] Kann ohne Kenntnis der konkreten Sprache geprüft werden!
\end{itemize}
\textit{Gültigkeit:}
\begin{itemize}[noitemsep]
\item evtl. Name des Wurzelelements
\item Elementnamen
\item Enthaltenseinsmodell für jedes Element (möglicher Inhalt eines Tags)
\item Attributnamen
\item Zugehörigkeit von Attributen zu Tags
\item Attributtyp (mögliche Attributwerte)
\item[$\Rightarrow$] Beschreibung der konkreten Grammatik
\end{itemize}
Gültigkeit kann anhand einer \acs{DTD} geprüft werden. Eine Alternative dazu ist \acf{XSD} (deutlich mehr Möglichkeiten für Inhaltsmodell und Typisierung, jedoch viel komplexer).
\end{itemize}
\section{DTD}\index{DTD}
Die \acf{DTD}\ldots
\begin{itemize}[noitemsep]
\item[\ldots] wird referenziert in einer (vollständigen) \code{DOCTYPE}-Deklaration.
\item[\ldots] ist textbasiert, aber nicht \acs{XML}-basiert
\item[\ldots] besteht aus einer Folge von (also beliebig vielen) Deklarationen (siehe \autoref{lst:xml_deklaration}) in der Variante der \code{DOCTYPE}-Deklaration
\end{itemize}
\medskip
\begin{lstlisting}[label=lst:xml_deklaration,language=HTML5,caption=DOCTYPE- und XML-Deklaration]
<!DOCTYPE html ... mit Param. als Aufzählung der Werte in bestimmter Reihenfolge>
<?xml ... mit Parametern als Parname="Parwert">
\end{lstlisting}
Für unsere Zwecke reichen zwei Deklarationen: \code{<!ELEMENT \ldots>} und \code{<!ATTLIST \ldots>}
\item[\code{tagname}] Name des Tags oder Elements, bestehend aus Buchstaben (Groß- und Kleinschreibung, case-sensitive), Ziffern, manchen Sonderzeichen (\zB Unterstrich/\enquote{\_}), beginnend nur mit Buchstabe oder Unterstrich.
Theoretisch kann der \code{tagname} eine beliebige Länge haben, sollte aber aus praktischen Gründen auf <\,256 Zeichen beschränkt werden. Zudem sollten keine Umlaute und sonstige nationale Sonderzeichen verwendet werden.
\item[\code{inhaltsmodell}] Dies kann sein: \hfill
\begin{description}
\item[\code{EMPTY}] Leeres Inhaltsmodell, \dash der Tag enthält immer genau nichts. \newline
Beispiel: \code{<!ELEMENT br EMPTY>} für einen Zeilenumbruch in HTML.
\item[\code{ANY}] Beliebiger Inhalt, \dash beliebige Mischung aus Text und Tags (welche aber in der \acs{DTD} deklariert sein müssen). Es gibt kein Beispiel in HTML (und jeder anderen dem Vorleser bekannten Grammatik). $\Rightarrow$ vor dem Inhaltsmodell \enquote{\code{ANY}} warnt der Vorleser!
\item[(\code{\#PCDATA})]\enquote{Parsed Character Data}\newline
Zeichenfolgen, welche keine Tag-ähnlichen Strukturen enthalten (\zB\enquote{<} mit \code{\<} umschreiben).\newline
\item[\code{tagname}] Der Tag, für welche die Attribute deklariert werden
\item[\code{attrname}] Name des Attributs (derselbe Aufbau und dieselben Einschränkungen wie für \code{tagname})
\item[\code{attrtyp}]\hfill
\begin{description}
\item[\code{CDATA}] (Character Data), \dash beliebige Zeichenfolge (inkl. Tag-ähnlichen Strukturen, welche hier einfache Zeichenfolgen darstellen. Doppelte Hochkommata müssen mit \html{"} umschrieben werden.
\textit{Beispiel}: \xml{<!ATTLIST img alt CDATA #REQUIRED>}
\item[\code{ID}]\label{xml:attrtyp:id} Dokumentenweit eindeutiger Attributwert, Aufbau/Zusammensetzung wie ein \code{tagname} (es ist kein rein numerischer Wert möglich).
\textit{Beispiel}: \xml{<!ATTLIST a id ID #IMPLIED>}
\item[\code{IDREF}, \code{IDREFS}] Ein Attributwert vom Typ ID, potentiell mehrere Attributwerte vom Typ \hyperref[xml:attrtyp:id]{ID} (durch Leerzeichen getrennt).
\textit{Beispiel} aus \acs{HTML}: Bei Formularen, nicht jedoch bei \html{<a href="">}
Aufbau ähnlich wie \code{tagname}, aber jedes der erlaubten Zeichen kann erstes Zeichen sein! So kann \code{123abc} kein Tagname sein, da Tags nicht mit einer Zahl anfangen dürfen, ein \code{NMTOKEN} jedoch schon!\newline
Durch Leerzeichen werden mehrere \code{NMTOKEN} voneinander getrennt.
\textit{Beispiel} aus \acs{HTML}: \xml{<!ATTLIST div class NMTOKENS #IMPLIED>}
\code{preceding-sibling}: & ältere Geschwisterknoten (preceding mit demselben parent)\\
\code{following-sibling}: & jüngere Geschwisterknoten (following mit demselben parent)\\
\code{attribute}: & am aktuellen Knoten hängender Attributknoten (alle anderen Achsenausdrücke sammeln nur Element- und keine Attributknoten)
\end{tabular}
\subsubsection{Verkürzte Schreibweise}
Eine Verkürzte Schreibweise der Lokalisierungsschritte für Achsen\footnote{siehe auch \url{https://de.wikipedia.org/wiki/XPath\#Achsen}}
\begin{center}
\begin{tabular}{rcl}
\code{bla}&$\hat{=}$&\code{child::bla}\\
\code{../bla}&$\hat{=}$&\code{parent::bla}\\
\code{./}&$\hat{=}$&\code{self}\\
\code{@fasel}&$\hat{=}$&\code{attribute::fasel}\\
\end{tabular}
\end{center}
\subsection{Knotentests}
Knotentests schränken die Elementauswahl einer Achse ein:
\begin{tabular}{rp{9.5cm}}
\code{tagname}& nur die Knoten mit dem entsprechenden \code{tagname} (bzw. bei \code{attribute} der \code{attrname}) \\
\code{*}& Alle Knoten (Wildcard) \\
\code{text()}& Alle Textknoten \\
\code{comment()}& Für Kommentarknoten \\
\code{processing-instruction()}& für Knoten mit \enquote{processing instructions}\\
\end{tabular}
\subsection{Prädikate}
Durch Angabe von Prädikaten kann das Ergebnis weiter eingeschränkt werden. Prädikate werden in eckige Klammern eingeschlossen und können in beliebiger Zahl hintereinander geschrieben werden, wobei die Reihenfolge wesentlich ist. Prädikate können \acs{XPath}-Ausdrücke enthalten, außerdem kann eine Vielzahl von Funktionen und Operatoren verwendet werden.\footnote{Quelle: \url{https://de.wikipedia.org/wiki/XPath}}
\begin{center}
\xml{axis::node-test[predicate][/...]}
\end{center}
Es handelt sich um eine Bedingung an die Knoten, welche erfüllt (\enquote{wahr}) sein muss.
\item Text \enquote{bla fasel blubber}. Whitespace wird auf ein Trennzeichen (\enquote{space}) reduziert.
\item Text \xml{<xsl:text> leer zeichen</xsl:text>}$\Rightarrow$ Whitespace bleiben erhalten!
\item\enquote{Werte} aus dem Quelldokument: \xml{<xsl:value-of select="Pfadausdruck" />}
\item\enquote{Wert} einer Knotenmenge
\begin{itemize}[noitemsep]
\item Konkatenation der Werte aller Knoten in der Knotenmenge
\end{itemize}
\item\enquote{Wert} eines Knotens
\begin{itemize}[noitemsep]
\item bei Textknoten: der Text
\item bei Attributknoten: der Text des Wertes des Attributknotens
\item bei Elementknoten: rekursive Ermittlung über alle Kindknoten, welche Element- oder Textknoten (\textit{nicht} Attributknoten) sind (Tiefensuche, keine Breitensuche entsprechend der Notation im \acs{XML}-Dokument).\newline
\begin{tabular}{lcl}
\html{<a>bla fasel blubba</a>}&$\Rightarrow$& Ein Textknoten an \html{<a>}\\
\html{<a>bla<i>fasel</i>blubba</a>}&$\Rightarrow$& zwei Textknoten an \html{<a>}
\end{tabular}
\end{itemize}
\end{itemize}
\subsubsection{Attribute}
\html{<p style="color:red;">Dieser Text ist rot</p>}$\Rightarrow$ fester Attributwert
\xml{<xsl:attribute name="Attributname">}$\Rightarrow$ erzeugt einen Attributknoten am soeben neu geöffneten (noch nicht geschlossenen und noch nicht mit Texten oder Elementknoten als Kinder versehen) Elementknoten.
\item das \code{match}-Attribut sorgt \textit{nicht} für den Aufruf/die Ausführung des Transformators
\item der \acs{XSLT} ruft ein Template für den Wurzeltag auf doch
\item mittels \xml{<xsl:apply-templates ...>} können Templates rekursiv aufgerufen werden
\begin{itemize}[noitemsep]
\item\xml{<xsl:apply-templates />} Template Aufruf für alle Kindelemente
\item\xml{<xsl:apply-templates select="Pfadausdruck />} Template-Aufruf für alle Knoten der adressierten Knotenmenge (nicht nur Kinder- und Elementknoten)
\end{itemize}
\item\enquote{schnelle} Alternative zur Rekursion: iterativer Durchgang durch eine Knotenmenge \medskip
\item Falls kein passendes selbstgeschriebenes Template existiert, existiert ein Default-Template (\textit{ohne} mode-Attribut), welches alle Textknoten und für Elementknoten Templates rekursiv aufruft.
\end{itemize}
Zweite Art von Templates: \enquote{named templates}/Templates mit Namen\medskip
Aufruf mittels: \xml{<xsl:with-param name="Bezeichner">Wert</xsl:with-param>} innerhalb von \xml{<xsl:apply-templates>} oder \xml{<xsl:call-template>}. \newline
Nutzung per \code{\$Bezeichner} innerhalb von \acs{XPath}-Ausdrücken.
\enquote{Variablen} können in einem Block (und auch direkt innerhalb von \xml{<xsl:stylesheet>} als \enquote{globale Variable}) definiert werden mittels:\newline
\xml{<xsl:variable name="Bezeichner">Wert</xsl:variable>} und Verwendung mittels \code{\$Bezeichner}.
\textit{Aber}: Der Wert einer \enquote{Variablen} ist nicht veränderbar, sondern fest. Es handelt sich also eher um Konstanten.
\xml{<xsl:param>} kann auch direkt im \xml{<xsl:stylesheet>} genutzt werden, um Parameter beim Aufruf des Stylesheets zu übergeben!