Valentin Wirth: PHP in XML speichern

Hallo,

Ich versuche gerade teile eines PHP Scripts mit in meine XML-Datei meiner Website zu stecken. Aus der Datei werden viele HTML/PHP Dateien via XLST generiert. Die XML Datei sieht im groben so aus.

<seite>
  <text>Seitenname</text>
  <file>dateiname.php</file>
  <content>Text und evt auch <? echo "PHP Codestücke" ?>.</content>
</seite>
...

Beim Versuch einfach den PHP Code wie folgt zu verpacken <content><? echo Test ?></content> gab es natürlich eine Fehlermeldung. (An dieser Stelle sind keine Leerzeichen zugelassen.) Wenn ich die Spitzen Klammern ersetzt kann ich zwar erfolgreich die Datei von XML in HTML/PHP konvertieren nur lässt sich dann das PHP nicht mehr ausführen sondern nur anzeigen. (&lt;? echo Test ?&gt;)

Nun dachte ich mir, dann lagere ich evtl den PHP Teil in eine extra Datei aus und bau mir ein kleines XML Tag. Das würde dann so aussehen:

<seite>
  <text>Seitenname</text>
  <file>dateiname.php</file>
  <content>Text und <phpdatei>abc/dateiname.php.txt</phpdatei>.</content>
</seite>

Das müsste sich ja evtl beim Transformieren dann durch die Datei ersetzten lassen. Nur wie? Bis jetzt habe ich nur gefunden das man andere Stylesheets inkludieren kann.

Wie macht man das normalerweise? Kann man durch XSLT ein XML Tag durch den Inhalt einer Datei ersetzen oder bin ich auf dem Holzweg? Ich währe euch für Hinweise dankbar. Irgendwie stehe ich auf dem Schlauch.

Alles Gute

Valentin

  1. Hi,

    ich weiß nicht, ob es dich weiter bringt, aber du könntest versuchen, den content-Bereich als CDATA zu deklarieren.
    http://de.selfhtml.org/html/xhtml/unterschiede.htm#script_style

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. ich weiß nicht, ob es dich weiter bringt, aber du könntest versuchen, den content-Bereich als CDATA zu deklarieren.

      Danke dir für den Tip, wenn ich den PHP Bereich als CDATA deklariere bekomme ich zwar keine Fehlermeldung mehr aber nach dem übersetzten sind alle Spitzen-Klammern in dem Bereich maskiert und werden daher nicht ausgeführt.

      1. Hallo,

        ich weiß nicht, ob es dich weiter bringt, aber du könntest versuchen, den content-Bereich als CDATA zu deklarieren.

        Danke dir für den Tip, wenn ich den PHP Bereich als CDATA deklariere bekomme ich zwar keine Fehlermeldung mehr aber nach dem übersetzten sind alle Spitzen-Klammern in dem Bereich maskiert und werden daher nicht ausgeführt.

        Ich nehme an, dass du den Inhalt von   <content><![CDATA[Text und evt auch <? echo "PHP Codestücke" ?>.]]></content> mit xsl:value-of ausgibst.
        Dann kannst du dabei <xsl:value-of disable-output-escaping="yes"> verwenden.

        Grüße
        Thomas

  2. hi,

    <seite>
      <text>Seitenname</text>
      <file>dateiname.php</file>
      <content>Text und evt auch <? echo "PHP Codestücke" ?>.</content>
    </seite>

    Versuchst du etwa, das als XML/XSLT parsen zu lassen?
    Halte ich für wenig sinnvoll.

    Da würde ich andersherum vorgehen - diesen Code erstmal durch den PHP-Parser schicken. Dann hast du auch eine Chance, dass das, was _dabei_ herauskommt, dann auch wohlgeformtes XML ist, und sich dann auch entsprechend verarbeiten lässt.

    Bleibt dann nur noch die Frage, wie - ob du zum "bösen" eval greifen willst?
    Wenn nein, könntest du obiges pseudo-XML auch erst mal als .php-Datei ablegen, und diese dann über HTTP öffnen lassen - dabei würde zunächst der PHP-Parser aktiv werden, und dir dann das Ergebnis seiner Arbeit zurückliefern.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Versuchst du etwa, das als XML/XSLT parsen zu lassen?
      Halte ich für wenig sinnvoll.
      Da würde ich andersherum vorgehen - diesen Code erstmal durch den PHP-Parser schicken. Dann hast du auch eine Chance, dass das, was _dabei_ herauskommt, dann auch wohlgeformtes XML ist, und sich dann auch entsprechend verarbeiten lässt.

      Ich habe eine XML "Datensammlung" aus der ich local via XSLT viele HTML Datein erstelle die dann auf einen Server gelasen weden sollen und dort erst evt enthaltener PHP Code ausgeführt werden soll. In dem Fall haldelt es sich um die Seite Suche die mit PHP und einer Indexdatei die Seite durchsuchbar machen soll. Das muss dynamisch auf dem Server geschehen.

      Bleibt dann nur noch die Frage, wie - ob du zum "bösen" eval greifen willst?

      Was meinst du mit bösen eval?

      Grüße

      Valentin

      1. Hier mal noch der Link zur Test-Webseite: http://www.goyo.de/gfl/search.php

        Den PHP Quelltext habe ich in der Version per Hand an die richtige Stelle kopiert. eigendlich soll er aber wie aller andere Inhalt auch aus der XML Datenbank kommen.

        Valentin

  3. echo $begrüßung;

    Ich versuche gerade teile eines PHP Scripts mit in meine XML-Datei meiner Website zu stecken.

    Aus deinem Posting geht mir nicht ganz klar hervor, was in welcher Reihenfolge passieren soll.
    Aber alles was im XML steht muss sich dessen Regeln beugen. Spätestens zu dem Zeitpunkt, an dem das XML verarbeitet werden soll. Das heißt, das PHP kann vorher quasi sich selbst durch XML-gerechten Output ersetzen oder die XML-gerechte Kodierung des PHP-Codes muss durch die XML-Verarbeitung in ordentliches PHP umgewandelt werden.

    (Übrigens: Es gibt nicht nur <? ?> und <?php ?> als PHP Opening and Closing Tags. Die Variante 2 aus Beispiel 10.2 scheint mir möglicherweise für deine Zwecke geeignet zu sein.)

    echo "$verabschiedung $name";

    1. Aus deinem Posting geht mir nicht ganz klar hervor, was in welcher Reihenfolge passieren soll.

      Erst soll mit XSLT eine HTML/PHP aus der XML Datei erzeugt werden und diese später als normale PHP Datei auf einen Server geladen werden und dort dynamisch ausgeführt werden.

      (Übrigens: Es gibt nicht nur <? ?> und <?php ?> als PHP Opening and Closing Tags. Die Variante 2 aus Beispiel 10.2 scheint mir möglicherweise für deine Zwecke geeignet zu sein.)

      Danke dir ein guter Tip. Somit kann ich schonmla ein großteil des PHP Scripts in der XML Datei speichern ohne Fehler beim Transformieren zu erzeugen. Zur Zeit trifft aber natürlich wieder das gleiche Problem auf sobald irgendwo

      for ($i = 0; $i < $nr_keywords; $i++ ) {...}

      steht. Ich bleib am Versuchen. Eine Testversion der Seite woran ich gerade arbeite gibts übrigends unter http://www.goyo.de/gfl/search.php.

      Alles Gute Dir

      Valentin

      1. echo $begrüßung;

        Danke dir ein guter Tip. Somit kann ich schonmla ein großteil des PHP Scripts in der XML Datei speichern ohne Fehler beim Transformieren zu erzeugen. Zur Zeit trifft aber natürlich wieder das gleiche Problem auf sobald irgendwo

        for ($i = 0; $i < $nr_keywords; $i++ ) {...}

        steht.

        Ich erkenne das Problem, und ich glaube, das Attribut disable-output-escaping von xsl:text wird dir weiterhelfen?

        echo "$verabschiedung $name";

  4. Hallo Valentin,

    XSL ist ziemlich begrenzt was das ausführen von Funktionen angeht, die nicht direkt etwas mit dem Transformationsprozess zu tun haben.
    Es gibt aber die Möglichkeit PHP Funktionen im XSL Code aufzurufen, und die Rückgabe der Funktion in das Transformationsergebnis einzubauen. Damit kannst Du alles was PHP kann auch in XSL tun.
    Du verlässt damit allerdings den XSL Standard, das ist eine proprietäre Ergänzung von PHP, aber das juckt Dich wahrscheinlich nicht wirklich :-)

    Die Doku findest Du hier, les Dir auch die Benutzerkommentare ganz unten durch:

    http://www.php.net/manual/en/function.xsl-xsltprocessor-register-php-functions.php

    Gruss

    Marko