Julian von Mendel: Wie einzelne Tags in einem XHTML-Dokument ersetzen?

Hi,

ich habe eine Frage. Und zwar frage ich mich, wie ich am besten einzelne Tags in einem XHTML-Dokument mit anderen ersetze. Dabei möchte ich die Ersatz-Elemente abhängig von den Attributen der ersetzten Elemente machen. Mir sind drei unterschiedliche Lösungsansätze eingefallen. Ich möchte wissen, welchen ihr bevorzugen würdet bzw. ob ihr noch einen weiteren kennt oder einen Fehler in meiner Vorgehensweise findet.

* Man könnte per XSLT das komplette Dokument parsen und durch PHP-Funktionen die Ersatzelemente bestimmen lassen (bzgl. der Einbindung von XSLT in PHP5 siehe http://www.zend.com/php5/articles/php5-xmlphp.php#Heading18)
* Man könnte per DOMXML/SimpleXML das Dokument durchgehen, alle Tags in ein neues Dokument kopieren und bei den zu ersetzenden Tags diese enstprechend verarbeiten
* Man könnte versuchen über einen relativ komplexen regulären Ausdruck die Elemente zu ersetzen

Was ist das einfachste? Gibt es eine bessere Lösung? Ich glaube, die erste wäre die eleganteste und aufwändigste. Die letzte wäre die dreckigste, aber evtl. wäre sie am einfachsten. Die in der Mitte sagt mir eigentlich am meisten zu. Die Verarbeitung von XSLT braucht wahrscheinlich auch am meisten Rechenleistung. Da ich eh' Caching verwenden werde ist das nicht der Weltuntergang, aber man kann ja versuchen etwas zu sparen...

Schöne Grüße
Julian

  1. Teilweise möchte ich auch ganze Elementgruppen abhängig von deren Unterelementen ersetzen. Das macht die Variante mit Regular Expressions fast unmöglich.

    Schöne Grüße
    Julian

  2. Man könnte auch per XPATH die Elemente durchgehen, die ersetzt werden sollen, die neuen Daten zusammenstellen und dann per sehr einfachen Regular Expressions die Ersetzung vornehmen.

    Schöne Grüße
    Julian

  3. Hi,

    ich hab jetzt eine Lösung mit DOMXML und Regular Expressions umgesetzt:

      
            $dom = new DomDocument();  
            $dom->loadXML($xml);  
      
            $tags = array("menu","list","rss");  
            $replace = array();  
      
            foreach($tags as $tag)  
            {  
                $nodes = $dom->getElementsByTagName($tag);  
                foreach($nodes as $node)  
                {  
                    $replacement = call_user_func_array(array($this,$tag),array($node));  
                    $xml = preg_replace("/<".addslashes($tag)."(.*?)(\\/>|<\\/".addslashes($tag).">)/s",$replacement,$xml,1);  
                }  
            }  
    
    

    Ich weiß nicht ob das sehr elegant ist, aber es funktioniert. (Ich hasse RegEx.)

    Schöne Grüße
    Julian

  4. Hallo Julian,

    * Man könnte per XSLT das komplette Dokument parsen und durch PHP-Funktionen die Ersatzelemente bestimmen lassen (bzgl. der Einbindung von XSLT in PHP5 siehe [

    so aufwändig ist das nicht, sofern es nur darum geht XHTML in ein anderes XML Format zu wandeln würde ich XSLT nehmen, und zwar ohne zusätzliche PHP Funktionen.
    Du legst einfach für jedes Tag das ersetzt werden soll ein Template an, fertig.

    Gruss

    Marko

    1. Hi,

      * Man könnte per XSLT das komplette Dokument parsen und durch PHP-Funktionen die Ersatzelemente bestimmen lassen (bzgl. der Einbindung von XSLT in PHP5 siehe [

      so aufwändig ist das nicht, sofern es nur darum geht XHTML in ein anderes XML Format zu wandeln würde ich XSLT nehmen, und zwar ohne zusätzliche PHP Funktionen.
      Du legst einfach für jedes Tag das ersetzt werden soll ein Template an, fertig.

      ich denke du hast meinen Ursprungstext nicht richtig gelesen, und die Ergänzungen auch nicht. Ich möchte u. A. Elementgruppen abhängig von deren Inhalt und Attributen dynamisch zusammenstellen, benötige also durchaus PHP. Weiterhin geht es nicht um eine Transformation, sondern um eine Ersetzung einzelner Tags. Man kann aus XSLT auch PHP-Funktionen aufrufen, und man kann die Aufgabe sicher theoretisch mit XSLT lösen, aber ich glaube, die Lösung die ich in meiner 3. Ergänzung gepostet habe ist am einfachsten.

      Schöne Grüße
      Julian

      1. Hello out there!

        ich denke du hast meinen Ursprungstext nicht richtig gelesen, und die Ergänzungen auch nicht.

        Ich denke, das hat er.

        Ich möchte u. A. Elementgruppen abhängig von deren Inhalt und Attributen dynamisch zusammenstellen,

        Dafür bietet XSLT im Gespann mit XPath weitreichende Möglichkeiten.

        benötige also durchaus PHP.

        Wahrscheinlich nicht.

        Weiterhin geht es nicht um eine Transformation, sondern um eine Ersetzung einzelner Tags.

        Na wenn das mal keine Transformation ist ...

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
        1. Hi,

          mir ist bewusst das die Aufgabe mit XSLT lösbar ist. Ich habe diese Möglichkeit ja selbst genannt. Aber Datenverarbeitung mittels XSLT ist stressig - sollen dann noch Daten aus einer Datenbankverbindung mit einbezogen werden, wirds wirklich unlustig. Deswegen hätte ich wenn überhaupt XSLT mit PHP kombiniert, d. h. wie im Zend-Artikel genannt aus dem XSLT-Stylesheet heraus PHP-Funktionen aufgerufen. Ich verstehe aber die Diskussion nicht, wo die 10 Zeilen, die ich bereits gepostet habe, funktionieren, und kaum kürzer/schneller umsetzbar sind. Jedes XSLT-Stylesheet wäre deutlich aufwändiger.

          Schöne Grüße
          Julian

          1. echo $begrüßung;

            Ich verstehe aber die Diskussion nicht,

            Nun, ich dachte auch zuerst daran, dass XSLT hier die beste Wahl wäre, aber der zweite Gedankengang war, dass ich entweder nicht die richtige(n) Methode(n) kenne oder XSLT doch deutlich von der Optimallösung entfernt ist. Deswegen würde ich gern diesen Lösungsansatz weiterverfolgen wollen, um festzustellen, ob es eine einfache, eine komplizierte oder keine Lösungsmöglichkeit auf diesem Weg gibt.

            Jedes XSLT-Stylesheet wäre deutlich aufwändiger.

            Es geht ja darum, eine Kopie des Originals zu erhalten, bei dem einige Teile verändert wurden. Den Haupt-Einsatzzweck von XSLT sehe ich darin, aus den Daten eines Dokuments ein neues zu generieren.

            Ich vereinfache mal die Aufgabenstellung. Gegeben sei ein XML-Dokument. In diesem soll der Inhalt eines Elements durch etwas anderes ersetzt werden. Der Pfad zu diesem Element ist entweder bekannt oder das Element lässt sich anhand eines einfachen Kriteriums auswählen (<element id="ichbins"> o.ä.). Alle anderen Elemente sollen kopiert werden, ohne dass die Struktur dem XSL-Dokument bekannt sein muss.

            Das XML-Dokument bekommt man noch bequem mit document() eingelesen, vielleicht in eine xsl:variable ... Und dann? Wie gehts es weiter?

            echo "$verabschiedung $name";

            1. Hallo echo,

              Ich verstehe aber die Diskussion nicht,

              Ich insofern auch nicht, dass es bereits eine funktionierende Lösung gibt.

              Jedes XSLT-Stylesheet wäre deutlich aufwändiger.

              Das ist Ansichtssache.

              Es geht ja darum, eine Kopie des Originals zu erhalten, bei dem einige Teile verändert wurden. Den Haupt-Einsatzzweck von XSLT sehe ich darin, aus den Daten eines Dokuments ein neues zu generieren.

              Aber das passiert ja auch, wenn men Teile eines Dokuments ersetzt/austauschst.

              Ich vereinfache mal die Aufgabenstellung. Gegeben sei ein XML-Dokument. In diesem soll der Inhalt eines Elements durch etwas anderes ersetzt werden. Der Pfad zu diesem Element ist entweder bekannt oder das Element lässt sich anhand eines einfachen Kriteriums auswählen (<element id="ichbins"> o.ä.). Alle anderen Elemente sollen kopiert werden, ohne dass die Struktur dem

              XSL-Dokument bekannt sein muss.
              ^^^^^*

              Das ist recht einfach. (* ist wohl X(HT)ML-Dokument gemeint?)

              Das XML-Dokument bekommt man noch bequem mit document() eingelesen, vielleicht in eine xsl:variable

              Wozu die Variable?

              ... Und dann? Wie gehts es weiter?

              Ein Template für alle Elemente, ein odere mehrere Templates für die auszutauschende Elemente. Ein apply-templates.

              echo "$verabschiedung $name";

              Wiedersehen, echo.

              Grüße
              Thomas

              1. Hi,

                Ich verstehe aber die Diskussion nicht,

                Ich insofern auch nicht, dass es bereits eine funktionierende Lösung gibt.

                jetzt verstehen wir schon zu dritt nix...

                Jedes XSLT-Stylesheet wäre deutlich aufwändiger.

                Das ist Ansichtssache.

                In wie fern ist Aufwändigkeit Ansichtssache? Allein schon der Kopf eines XSLT-Stylesheets ist ähnlich lang wie mein Skript *g*.

                echo "$verabschiedung $name";

                Wiedersehen, echo.

                Es heißt "echo 'Wiedersehen';".

                Schöne Grüße
                Julian

                1. Hallo,

                  Jedes XSLT-Stylesheet wäre deutlich aufwändiger.

                  Das ist Ansichtssache.

                  In wie fern ist Aufwändigkeit Ansichtssache? Allein schon der Kopf eines XSLT-Stylesheets ist ähnlich lang wie mein Skript *g*.

                  Das ist eben (d)eine Meinung. Und schon sind wir anderer Ansicht. ;-)

                  echo "$verabschiedung $name";

                  Wiedersehen, echo.

                  Ne, der Mensch der postete heisst "echo", das hat er ja oft genug gesagt ;-)

                  Grüße
                  Thomas

                  1. Hi,

                    Jedes XSLT-Stylesheet wäre deutlich aufwändiger.

                    Das ist Ansichtssache.

                    In wie fern ist Aufwändigkeit Ansichtssache? Allein schon der Kopf eines XSLT-Stylesheets ist ähnlich lang wie mein Skript *g*.

                    Das ist eben (d)eine Meinung. Und schon sind wir anderer Ansicht. ;-)

                    Länge ist keine Meinungssache, das ist eine typische Einbildung einiger Männer.

                    Schöne Grüße
                    Julian

                    1. Hallo,

                      In wie fern ist Aufwändigkeit Ansichtssache? Allein schon der Kopf eines XSLT-Stylesheets ist ähnlich lang wie mein Skript *g*.

                      Das ist eben (d)eine Meinung. Und schon sind wir anderer Ansicht. ;-)

                      Länge ist keine Meinungssache, das ist eine typische Einbildung einiger Männer.

                      Ich verstehe nicht, was du mit deinem Satzt bezweckst.

                      Falls du sachlich diskutieren möchtest (und eigentlich bin ich trotzt Smileys davon ausgegangen): der Kopf einer XSL-Datei braucht nur so lang zu sein: <?xml version="1.0"?> .

                      Falls du nicht sachlich diskutieren möchtest: du entschuldigst mich, ich habe zu tun.

                      Grüße
                      Thomas