minimalist: XSL-Basics - Achtung: Neuling!

Hallo allerseits,

ich bin - nachdem ich mich einige Zeit vertieft in XHTML und CSS eingearbeitet habe - nun dabei, mich in XML und XSLT einzuarbeiten. Also Achtung: Hier kommt ein absoluter Neuling.

Ich versuche gerade, den richtigen Umgang mit <xsl:result-document href="..."> herauszufinden. Da tue ich mich etwas schwer.

Also erstmal ein paar Fragen eines Forums-Neulings:

1. Wird XSL 2.0 von den gängigen Browsern unterstützt? Wo finde ich Infos zur Browserkompatibilität?

2. Wie kann ich aus einer XSLT-Datei mehrere HTML-Dateien generieren, die auf dieselbe XML-Datei zugreifen? Funktioniert das mit result-document? Brauche ich zusätzlich PHP?

3. Wie genau zeige ich die HTML-Datei, die ich generieren möchte, an? Muss ich dazu die XSLT-Datei öffnen? Oder die XML-Datei? Bei letzterem gibt's mit Firefox 2 einen Parsingfehler. Öffne ich hingegen die XSL-Datei, fehlt dem Browser die Stylesheet-Verknüpfung.

Vielleicht bin ich ja auch zu blauäugig und die Browser können mit XSL 2 noch gar nicht umgehen?! Wie gesagt: Ist für mich ziemliches Neuland und ich freue mich auf eure Antworten. Gerne könnt ihr auch auf alte Threads verweisen, die ich möglicherweise bei meiner bisherigen Recherche übersehen habe.

Gruß
Johannes

  1. Hallo Johannes,

    1. Wird XSL 2.0 von den gängigen Browsern unterstützt? Wo finde ich Infos zur Browserkompatibilität?

    Alle Browser die ich kenne unterstützen nur XSLT 1.0 - das aber meines Wissens zumindest vollständig.

    XSLT 2.0 kannst Du im Prinzip vergessen, wenn Du browserseitig transformieren willst.

    Wenn Du serverseitig transformieren willst, dann gibt es eigentlich nur Saxon-B 9 als einizge Open-Source-Lösung, die XSLT 2.0 kann - das gibt's für Java und .NET.

    1. Wie kann ich aus einer XSLT-Datei mehrere HTML-Dateien generieren, die auf dieselbe XML-Datei zugreifen? Funktioniert das mit result-document?

    Prinzipiell schon, allerdings nur in XSLT 2.0 - und das kannst Du wie gesagt im Browser vergessen.

    Brauche ich zusätzlich PHP?

    PHP verwendet die libxslt - und die kann nur XSLT 1.0 und Teile von EXSLT. In EXSLT gibt's exsl:document - siehe http://www.exslt.org/exsl/elements/document/ - vielleicht kann das das, was Du willst - ausprobiert habe ich's unter PHP aber noch nicht. XSLT 2.0 wird von PHP nicht unterstützt. Allerdings: Lies bitte unten weiter diesbezüglich.

    1. Wie genau zeige ich die HTML-Datei, die ich generieren möchte, an? Muss ich dazu die XSLT-Datei öffnen? Oder die XML-Datei? Bei letzterem gibt's mit Firefox 2 einen Parsingfehler. Öffne ich hingegen die XSL-Datei, fehlt dem Browser die Stylesheet-Verknüpfung.

    Wenn Du aus einer XML-Datei eine einzige HTML-Datei mit XSLT 1.0 (!) erzeugen willst und das im Browser tun willst, öffnest Du die XML-Datei im Browser. Die XML-Datei sollte dann die Stylesheet-Angabe enthalten, dann transformieren heutige Browser automatisch (siehe die Beispiele aus SELFHTML).

    Alternativ kannst Du mit einer serverseitigen Technik die XML-Datei mit dem XSLT transformieren und dann das Resultat an den Browser schicken. Der Browser sieht dann nur HTML. Hier steht Dir serverseitig alles zur Verfügung, was es für die jeweils verwendete Technik gibt.

    Wenn Du aus einer XML-Datei mehrere HTML-Dateien erzeugen willst, dann hast Du browserseitig keine Möglichkeit, die können das alle nicht.

    Serverseitig hast Du zwei Möglichkeiten für multiple Dokumente:

    1) Du nimmst XSLT 2.0 oder EXSLT und generierst die Dokumente sobald die
        XML-Datei geändert wird. Die resultierenden Dokumente legst Du als
        statische HTML-Dokumente ab, die im Browser geöffnet werden können.

    2) Beim Aufruf eines serverseitigen Programms (PHP-Script, Java-Servlet,
        etc.) wird eine XSLT-Transformation angestoßen, die nur *eine* Ausgabe-
        datei liefert. Welche geliefert werden soll wird dem XSLT als Parameter
        übergeben.

    Beispiel:

    Du hast eine Datei buch.xml, die zwei Kapitel enthält. Jedes Kapitel soll eine eigene Seite sein, sowie das Inhaltsverzeichnis.

    Bei Möglichkeit 1 würdest Du jedes Mal, wenn Du buch.xml änderst (*NICHT* jedoch beim Aufruf über's Web!) ein XSLT 2.0 oder ein XSLT 1.0 + EXSLT Stylesheet auf die Datei anwenden und dieses Stylesheet würde 3 Dateien erzeugen: "index.html", "kapitel1.html", "kapitel2.html". Diese könntest Du dann ganz normal als statische Dokumente über's Web ausliefern.

    Bei Möglichkeit 2 würdest Du bei jedem Aufruf unterscheiden, welche Seite angefordert wurde, wenn Du das z.B. mit PHP machst könntest Du ein Scrpit xslt.php schreiben und dann per PATH_INFO arbeiten, also z.B. so:

    http://example.org/xslt.php/index.html wird aufgerufen
           -> In PHP ist $_SERVER['PATH_INFO'] auf '/index.html' gesetzt
    http://example.org/xslt.php/kapitel1.html wird aufgerufen
           -> In PHP ist $_SERVER['PATH_INFO'] auf '/kapitel1.html' gesetzt

    Das Script xslt.php würde dann ein normales Stylesheet (das könnte dann ganz normales XSLT 1.0 sein ohne EXSLT und muss auch kein XSLT 2.0 sein) auf die Datei »buch.xml« anwenden und diesem Stylesheet einen Parameter mitgeben, bevor es die Transformation anstößt. Das Stylesheet würde dann per xsl:if oder xsl:choose unterscheiden können, welche Seite es nun generieren soll.

    Viele Grüße,
    Christian

    1. Hallo Christian,

      danke für deine ausführliche Antwort. Das klingt alles sehr schlüssig (und ich werde mir noch eine geeignete Lösung aus den von dir vorgeschlagenen aussuchen).

      Schade, ich dachte die Browser wären schon weiter. Ideal wäre doch:

      1. XML-Datenbank enthält alle Inhalte für die Website
      2. XSL-Stylesheet generiert durch einen übergebenen Parameter eine XHTML-Datei aus einer Position aus der XML-Datei
      3. CSS für das Layout

      Durch das Anklicken der Links zwischen den Seiten ändert der Nutzer dann nur den Wert des übergebenen Parameters. Wäre schön, wenn das bald mal so funktionert, dann ist die Datenmenge im Netz nochmal geringer als bei mordernen CSS-Seiten, die ja verglichen mit Tabellenlayouts auch schon vieles an Einsparung gebracht haben.

      Ich glaube, ich bleibe dann erstmal bei einer herkömmlichen CSS-Seite und generiere die HTML-Dateien aus clientseitigen Templates.

      Also: Vielen Dank ncohmal.

      Gruß
      Johannes

      1. Hallo Johannes,

        für den Fall, dass Du sie noch nicht kennst hier eine sehr nützliche FAQ-Sammlung zu XSLT

        http://www.dpawson.co.uk/xsl/sect2/sect21.html

        Ich glaube, ich bleibe dann erstmal bei einer herkömmlichen CSS-Seite und generiere die HTML-Dateien aus clientseitigen Templates.

        falls Dich das mit der serverseitigen Transformation doch noch interessiert,
         ich habe da kürzlich mal eine Beispielseite zu dem Thema angefangen.

        http://www.simplecontent.net/simplepage/index.html
        (Vorsicht kreischendes Orange ;)

        Viele Grüße

        Stefan

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Hallo Stefan,

          vielen Dank auch für deine Links. Die "Simplepage" sieht super aus! Ich glaube, dass ich den benötigten Apache-Server und PHP5 bei 1&1 leider nicht habe. Ich sollte vielleicht mal umziehen...

          Übrigens: Meine Seite ist auch orange! ;)

          Gruß
          Johannes