urvater Logo

XML - als Datenspeicher

Nicht immer sind die Daten, die man benötigt so viele, dass man zwingend eine Datenbank benutzen muß. Bei kleineren Datenmenge, die auch manuell leicht noch handhabbar sind, reicht es daher meist auch aus diese in eine Datei anstatt in eine Datenbank zu schreiben.
Als Beispiel werde ich ein Kochbuch nutzen um eine XML basierte Lösung zu zeigen. Dies ist nicht zwingend auch die einziege Lösung für ein solches Problem.

Als Grundlage werde ich eine einfache XML Datei verwenden.
rezepte.xml

<?xml version="1.0" encoding="UTF-8" ?>
<Rezepte>
    <Rezept>
        <Titel>(string) der Titel des Rezeptes</Titel>
        <Personen>(int) Anzahl der Personen dür die dieses Rezept gedacht ist</Personen>
        <Zutaten>
            <Zutat>(string) eine Zutat</Zutat>
            <Zutat>(string) eine weitere Zutat</Zutat>
            <Zutat>(string) etc. unbestimmte Anzahl an Zutaten</Zutat>
        </Zutaten>
        <Zubereitung>(string) die Beschreibung, wie das Rezept zubreitet werden
            sollte.
        </Zubereitung>
        <Zubereitung>(string) Es könnten mehrere Schrittte vorhanden sein, die eine Aufzählung
            der einzelnen Schritte erfordert.
        </Zubereitung>
    </Rezept>
</Rezepte>

Der Grundgedanke dabei ist, dass es mehrere Rezepte geben kann, die wiederum mehrere Zutaten und Zubereitungsschritte haben können. Die Verarbeitung der XML- und XSL Datei übenimmt hier PHP, mit seinen dafür vorgesehen Klassen.
Grund dafür ist, dass zum Einen die Daten nur einen Teil der Webseite ausmachen und zum Anderen ich mich nicht auf den Browser des Client verlassen möchte um die Stylesheetanweisungen umzusetzen. Zusätzlich verwende ich verschiedene XSL Dateien. Je nach Aufruf der Seite wird die entsprechende XSL Datei ausgewählt. Beim Client kommt daher reines HTML an.

Aufruf des Kochbuches ohne Get- oder Post-Variablen

Als Einstieg ins Kochbuch lasse ich ein Inhaltsverzeichnis erzeugen, welches alle enthaltenen Rezepte anzeigt. Hierfür habe ich eine index.xsl erstellt, da nur der Titel jedes Rezeptes angezeigt werden soll.
index.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="xml" omit-xml-declaration="yes" />
    
    <xsl:template match="/">
        <h4>Inhatsverzeichnis Rezepte</h4>
        
        <ul>
            <xsl:for-each select="Rezepte/Rezept">
                <li style="list-style:none;"><xsl:apply-templates /></li>
            </xsl:for-each>
        </ul>
    </xsl:template>
    
    <xsl:template match="Titel">
        <xsl:number level="single" count="Titel" format="1. " />
        <a>
            <!--Erzeugung der Links selbst. Die Nummer des Eintrages in der XML Datei-->
        <xsl:attribute name="href">?xml/kochbuch/rezept/<xsl:value-of select="." />
        </xsl:attribute>
            <xsl:value-of select="." />
            <!--erzeugter Link <a href="?xml/kochbuch/rezept/Rezepttitel">Rezepttitel</a>-->
        </a>
    </xsl:template>
</xsl:stylesheet>

Mit Ausnahme der Ausgabe wieviele Rezepte vorhanden sind, sieht das Inhaltsverzeichnis dann so aus:

Inhaltsverzeichnis Rezepte

Es sind 3 Rezepte vorhanden.