Markus Schnitzler: include in XSL-Datei nutzen

Ich habe gerade damit begonnen, auf meiner Homepage PHP zu nutzen. Mit Hilfe der Funktion "include" füge ich die Kopfzeile und das Menü ein. Das sieht so aus:
<?php include "kopf0.php" ?>
bzw.
<?php include "menu0.php" ?>

Das funktioniert so weit problemlos. Nun habe ich aber auf meiner Homepage auch ein paar XML-Dokumente, in denen ich Kopf und Menü ebenfalls mit dieser Methode einbinden möchte. Wenn ich den o.g. Code  in die dazugehörige XSL-Datei schreibe, erhalte ich keine Fehlermeldung, aber der include-Befehl wird bei der Darstellung einfach ignoriert, während der Rest des Dokuments korrekt angezeigt wird.

Ich habe auch die erste Zeile der XSL-Datei folgendermaßen erweitert:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">

Das hilft mir aber nicht weiter.
Wie kann ich den include-Befehl in XML nutzen?

  1. echo $begrüßung;

    Wie kann ich den include-Befehl in XML nutzen?

    Du musst die Reihenfolge beachten. Was wird aufgerufen, welches System erzeugt welches Dokument? Wer bekommt das XSL? Wird das bei einem Request durch den Browser ausgeliefert? Ist der Webserver so konfiguriert, dass diese Datei vor dem Ausliefern durch PHP geschickt wird?

    echo "$verabschiedung $name";

    1. Ich wollte eigentlich gerne eine Antwort auf meine Frage haben, nicht eine Liste mit weiteren Fragen, die ich nicht beantworten kann.

      1. echo $begrüßung;

        Ich wollte eigentlich gerne eine Antwort auf meine Frage haben, nicht eine Liste mit weiteren Fragen, die ich nicht beantworten kann.

        Dann kann ich dir auch nicht weiterhelfen, denn Hellsehen kann ich nicht. Diese Fragen ergaben sich bei mir, als ich deine Anfrage sah. Ohne deren Beantwortung kann ich zu dem Problem nichts weiter sagen.

        echo "$verabschiedung $name";

  2. Hallo,

    Nun habe ich aber auf meiner Homepage auch ein paar XML-Dokumente, in denen ich Kopf und Menü ebenfalls mit dieser Methode einbinden möchte. Wenn ich den o.g. Code  in die dazugehörige XSL-Datei schreibe, erhalte ich keine Fehlermeldung, aber der include-Befehl wird bei der Darstellung einfach ignoriert, während der Rest des Dokuments korrekt angezeigt wird.

    Ich habe auch die erste Zeile der XSL-Datei folgendermaßen erweitert:

    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">

    Das hilft mir aber nicht weiter.
    Wie kann ich den include-Befehl in XML nutzen?

    Überhaupt nicht.
    Wenn du die XML/XSL-Transformation mit PHP machst*, rufst du einen XSL-Prozessor auf, ab dem Zeitpunkt ist dieser für die Datei zuständig und führ ihn ist ein "<?php include "menu0.php" ?>" nur eine Verarbeitungsanweisung mit der er nichts anfangen kann.
    * Gilt eigentlich auch, wenn du das dem Browser überläßt.

    Für dich heißt es, dass dein XSL zuerst von PHP selbst verarbeitet werden müsste, um die Elemente in den XSL _vor_ der TRanformation einzufügen (was u.U. dann dein XSL ungültig macht.
    Oder du kannst für die Ausgabedokument eine Verarbeitungsanweisung in deinem XSL erzeugen:
    (innerhalb eines Templates)
    <xsl:processing-instruction name="php">xsl:textinclude "menu0.php"</xsl:text></xsl:processing-instruction name="php">

    Damit hast du dann im Ergebnisdokument dein <?php include "menu0.php" ?>. Das bedeutet aber, dass dieses Dokument noch von PHP verarbeitet werden muss.

    Grüße
    Thomas

    1. ....

      <xsl:processing-instruction name="php">xsl:textinclude "menu0.php"</xsl:text></xsl:processing-instruction name="php">

      natürlich so:

      <xsl:processing-instruction name="php">xsl:textinclude "menu0.php"</xsl:text></xsl:processing-instruction>

      Grüße
      Thomas

      1. <xsl:processing-instruction name="php">xsl:textinclude "menu0.php"</xsl:text></xsl:processing-instruction>

        Ich habe diesen Code eingebaut, aber das Ergebnis ist das gleiche. Es wird keine Kopfzeile und kein Menü angezeigt.

        1. Hallo,

          <xsl:processing-instruction name="php">xsl:textinclude "menu0.php"</xsl:text></xsl:processing-instruction>

          Ich habe diesen Code eingebaut, aber das Ergebnis ist das gleiche. Es wird keine Kopfzeile und kein Menü angezeigt.

          Und wird das <?php include "menu0.php"?> in das Ergebnisdokumet (generierst du HTML?) geschrieben?

          Übrigens, für weitere Hilfe wird es notwendig sein, dass du _uns_ auch mal ein wenig mehr Informationen lieferst.
          Ein bescheidener "es geht nicht" ist echt keine Meldung mit dem man was anfangen kann um dir helfen zu können.

          z.B. was steht in diesem menu0.php? Ist die Datei auch dynamsich, oder enthält lediglich statischen HTML-Kode? Wie machst du die XML/XSL-Transformation: per PHP, oder überläßt du es dem Browser?

          Grüße
          Thomas

          1. Übrigens, für weitere Hilfe wird es notwendig sein, dass du _uns_ auch mal ein wenig mehr Informationen lieferst.

            Ich habe die beiden einzufügenden PHP-Dateien und eines der XML/XSL-Dokumente mal hier zusammengefasst, damit ihr euch mal einen Überblick verschaffen könnt:

            http://www.mschnitzler2000.de/include-problem.zip

            Wie machst du die XML/XSL-Transformation: per PHP, oder überläßt du es dem Browser?

            Ich bearbeite die XML/XSL-Dateien auf der Festplatte mit dem Programm XML Writer und lade sie dann per FTP auf meinen Webspace bei Strato hoch.

            1. Hallo,

              Übrigens, für weitere Hilfe wird es notwendig sein, dass du _uns_ auch mal ein wenig mehr Informationen lieferst.

              Ich habe die beiden einzufügenden PHP-Dateien und eines der XML/XSL-Dokumente mal hier zusammengefasst, damit ihr euch mal einen Überblick verschaffen könnt:

              »

              Danke, aber damit kommen wir nicht weiter.

              Wie machst du die XML/XSL-Transformation: per PHP, oder überläßt du es dem Browser?

              Ich bearbeite die XML/XSL-Dateien auf der Festplatte mit dem Programm XML Writer und lade sie dann per FTP auf meinen Webspace bei Strato hoch.

              OK, mir scheint wir haben da ein kleines Kommunikationsproblem.

              Also: damit PHP-Anweisungen (wie <?php include "menu.php"?>) ausgeführt werdne, muss die Datei die so eine anweisung enthält, vom PHP-Interpreter am Server verarbeitet werden.(1)

              Alles so lang kein Problem, bis der Server weiß, welche Dateien der dem PHP-Interpreter übergeben muss, damit er diese Dateien verarbeitet, so dass der Serven dann am Ende dem Browser nur noch HTML schickt.(2)

              Jetzt kommt dein XML und XSL ins Spiel:
              So wie ich deine Dateien gesehen habe, überläßt du die XML/XSL-Transformation dem Browser (d.h. in der Adressenzeile des Browser steht dann so etwas: http://www.example.org/foo/auswaerts.xml).

              Wenn das wirklich der Fall ist, musst du die Sache mit dem PHP im XSL gleich vergessen. Die Browser können nichts mit PHP-Anweisungen anfangen, also werden sie auch keine <?php include "menu.php"?> ausführen.

              Wenn du aber die XML/XSL-Transformation am Server machst (d.h. das XML wird am Server mit dem XSLT transformiert und der Server sendet am Ende wieder nur schlichtes HTML an den Browser.), dann hast du gute Chancen, dass du dein Vorhaben verwirklichen kannst. Trotzdem muss du einige Dinge überlegen.

              (1) und (2) sind auch hier noch wichtig.
              Und wieder kommt dein XML und XSL ins Spiel.
              Was passiert jetzt: der Besucher deiner Seite hat jetzt so etwas in der Adressenzeile seines Browsers: http://www.example.org/foo/auswaerts.php.
              Der Server weiß nun, dass er .php Dateien dem PHP-Interpreter übergeben muss.
              Nun stehen in deinem PHP-Script die Anweisungen für PHP wie er die XML/XSL-Transformation machen kann und soll.
              PHP sucht also deine XML-Datei und transformiert sie mit deiner XSL-Datei zu HTML. Und da hast du das Problem: du hast hier als Ergebnis der Tranformation HTML, dass der Server dann auch gleich dem Browser schickt, der natürlich noch immer keine Ahnung hat was er mit einem "<?php include "menu.php"?>" im HTML machen soll.

              Was kannst du machen?
              Du musst dieses HTML abfangen und es wieder dem den PHP-Interpärter übergeben, damit er dann die Anweisung <?php include "menu.php"?> ausführt.
              Das kannst du auf zweiterlei Arten machen:

              • du bringst deinem PHP-Skript bei, dass der _vor_ einer XML/XSL-TRansformation das XSL wie eine PHP-Datei behandeln soll: also die Datei verarbeiten, die PHP-Anwesungen in der Datei ausführen und so an Ende ein XSL-Datei zu haben, in der schon alles inkludiert ist (also auhc das Menü etc.) Dann kannst du erst dein XML mit diesem neuen XSL transformieren.

              • die andre Variante: du führst zuerst die XML/XSL-Transformation am Server aus: fängst du das Ergebniss der TRansformation ab, und übergibts diese Ergebnis dem PHP-Interpreter, damit er die PHP-Anweisungen die in dieser Datei stehen ausführt und erst dann über den Server das endgültige HTML an den Browser sendet.
                Diese Variante wäre die einfachere.

              Ab hier muss du also die Sache eben vergessen (Transformation im Browser) oder du musst dich kräftig in die PHP-Dokumentation einarbeiten.

              Grüße
              Thomas

              1. Ab hier muss du also die Sache eben vergessen (Transformation im Browser) oder du musst dich kräftig in die PHP-Dokumentation einarbeiten.

                Also, das wird mir definitiv zu kompliziert. Ich füge das Menü und die Kopfzeile ja per include-Befehl ein, damit ich diese beiden Bestandteile meiner Homepage zentral bearbeiten kann. Aber dann bearbeite ich lieber die drei, vier XML-Dokumente per Hand, ehe ich mir das komplette PHP-Handbuch durchlese und dann am Ende vielleicht trotzdem nicht weiterkomme.

                1. Hallo,

                  Ab hier muss du also die Sache eben vergessen (Transformation im Browser) oder du musst dich kräftig in die PHP-Dokumentation einarbeiten.

                  Also, das wird mir definitiv zu kompliziert. Ich füge das Menü und die Kopfzeile ja per include-Befehl ein, damit ich diese beiden Bestandteile meiner Homepage zentral bearbeiten kann. Aber dann bearbeite ich lieber die drei, vier XML-Dokumente per Hand, ehe ich mir das komplette PHP-Handbuch durchlese und dann am Ende vielleicht trotzdem nicht weiterkomme.

                  Na ja sooo kompliziert ist das wiederum nicht.
                  Im Endeffekt musst du nur das aus der XML/XSL-Transformation gewonnenes HTML abfangen. Also statt es direkt dem Browser zu senden, nochmal durch PHP jagen.

                  Aber ich verstehe schon was du meinst. ;-)

                  Grüße
                  Thomas