Alex Wilde: Templates dynamisch im Browser generieren...?

Tach zusammen,

Ich habe heute versucht mich etwas in XSLT einzuarbeiten und hänge nun an einem Problem. Kurz zu meinem Verständnis: XML lässt sich (zB mit PHP) schon auf dem Server via XSLT in bspw. XHTML umwandeln oder clientseitig im Browser "nach"-parsen.
Die serverseitige Lösung kommt leider nicht in Frage, das XML muss im Browser umgewandelt werden.

Problem:
gibt es eine Möglichkeit dass Templates in XSLT dynamisch im Browser generiert werden?

Beispiel:
Der XML-tag <bild id="14"> soll als <img>-tag dem Browser verständlich gemacht werden. Eine normale Umwandlung à la

<xsl:template match="bild">
<img src="{@id}">
</xsl:template>

kann in diesem Fall leider nicht klappen weil - richtig - "14" kein src-Pfad ist sondern `ne interne id. Diese id müßte ich jetzt an ein php-Skript übergeben können, das mir den passenden Bild-Pfad ausspuckt.
Ich weiß nicht ob das mit einer processing-instruction machbar wäre, es hat bei mir bis jetzt jedenfalls nicht funktioniert, ich gehe deshalb davon aus dass diese PI's für serverseitig Parser gedacht sind und das hilft mir wieder wenig.

Für guten Rat bin ich sehr dankbar.

  1. Hallo Alex Wilde!

    Beispiel:
    Der XML-tag <bild id="14"> soll als <img>-tag dem Browser verständlich gemacht werden. Eine normale Umwandlung à la

    <xsl:template match="bild">
    <img src="{@id}">
    </xsl:template>

    Wie wärs damit, wenn Du einfach <img src="path/to/image/script.php?id=14" ... /> daraus machst sollte es doch funktionieren.
    Ansonsten könntest Du vielleicht noch z.B. &id14; als Entity in die DTD schreiben und dann eben das irgendwie verbauen (dann müßte natürlich in der DTD der richtige Pfad stehen). Die Idee mit dem Entity kommt mir aber irgendwie komisch vor, vielleicht gibts da doch Probleme, die mir jetzt spontan nicht aufgefallen sind.
    Ich würds über ein Script machen, dem die ID übergeben wird.

    MfG
    Götz

    --
    Losung für Donnerstag, 27. Januar 2005
    Glaubt ihr nicht, so bleibt ihr nicht. (Jesaja 7,9)
    Paulus und Barnabas stärkten die Seelen der Jünger und ermahnten sie, im Glauben zu bleiben, und sagten: Wir müssen durch viele Bedrängnisse in das Reich Gottes eingehen. (Apostelgeschichte 14,22)
    (Losungslink)
    1. Hallo,

      Ansonsten könntest Du vielleicht noch z.B. &id14; als Entity in die DTD schreiben

      Kann er nicht, da z.B. Mozilla keine Entities in extrenen DTDs auflösen kann.
      Also das mit dem scr=".... .php?id=14" ist noch die bessere Lösung.

      Grüße
      Thomas

      1. Danke für Eure Antworten!

        Ich stehe aber momentan vor ganz anderen Schwierigkeiten.. vielleicht kann mir jmd der schon etwas mehr Erfahrung damit hat mir nochmal behilflich sein:

        wie kann ich in einer "normalen" HTML-Umgebung (wenn's geht nicht XHTML..) eigensdefinierte XML-Tags mit XSLT umwandeln lassen?

        <html>
        ...
        <bild id="14">
        ...
        </html>

        Ich hab's schon mit gemischten Namensräumen versucht, bekomme das aber alles nicht geregelt ;(
        ich blicke da einfach noch nicht so ganz durch.

        vielen Dank für Eure Hilfe

        1. Hallo Alex!

          wie kann ich in einer "normalen" HTML-Umgebung (wenn's geht nicht XHTML..) eigensdefinierte XML-Tags mit XSLT umwandeln lassen?

          <bild id="14">

          Gar nicht. Mit HTML schon gleich gar nicht.
          Wenn, dann höchstens mit XML (also XHTML), aber wie schon gesagt, am besten ist es wohl serverseitig über ein Script lösbar, daß der ID eine Datei zuordnet.

          MfG
          Götz

          --
          Losung für Freitag, 28. Januar 2005
          Du hast mein Leben aus dem Verderben geführt, Herr, mein Gott! (Jona 2,7)
          Jesus sprach zu dem Gelähmten: Sei getrost, mein Sohn, deine Sünden sind dir vergeben. (Matthäus 9,2)
          (Losungslink)
        2. Hallo,

          wie kann ich in einer "normalen" HTML-Umgebung (wenn's geht nicht XHTML..) eigensdefinierte XML-Tags mit XSLT umwandeln lassen?

          <html>
          ...
          <bild id="14">
          ...
          </html>

          Du möchtest unbedingt was problematisches? ;-)

          Du kannst es mit XML Data Islands versuchen:
          Mozilla:
          http://www.mozilla.org/xmlextras/xmldataislands/

          IE:
          http://msdn.microsoft.com/library/en-us/xmlsdk/html/xmconusingxmldataislandsandclientsidexslt.asp
          http://msdn.microsoft.com/library/en-us/xmlsdk/html/xmconSampleHTMLFileforXMLDataIslands.asp

          Grüße
          Thomas
          PS: http://www.google.de/search?hl=de&q=xml+data+island&spell=1

          1. das scheint tatsächlich etwas zu kompliziert zu sein. Ich hab's nochmal mit vermischten Namensräumen versucht und möchte hier kurz die Codes posten:

            --- XHTML ---
            <?xml version="1.0" encoding="iso-8859-1"?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
            <html xmlns="http://www.w3.org/1999/xhtml" xmlns:media="media.xsd" lang="de" xml:lang="de">
             <media:bild />
             <b>nur html</b>
            </html>

            --- Stylesheet ---
            <?xml version="1.0" encoding="ISO-8859-1"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
             <xsl:template match="bild">
             wurde ersetzt
             </xsl:template>
            </xsl:stylesheet>

            --- XSD ---
            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
            <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
             <xs:element name="bild">
              <xs:complexType mixed="true">
               <xs:choice minOccurs="0" maxOccurs="unbounded"/>
              </xs:complexType>
             </xs:element>
            </xs:schema>

            ich hoffe es wird deutlich was passieren soll: in der xhtml umgebung müsste <media:bild /> durch "wurde ersetzt" ersetzt werden...
            tut es aber nicht. Warum?

            1. hALLO;

              das scheint tatsächlich etwas zu kompliziert zu sein. Ich hab's nochmal mit vermischten Namensräumen versucht und möchte hier kurz die Codes posten:

              ich hoffe es wird deutlich was passieren soll: in der xhtml umgebung müsste <media:bild /> durch "wurde ersetzt" ersetzt werden...
              tut es aber nicht. Warum?

              Weil du den Namensraum vergessen hast.

              <media:bild />

              --- Stylesheet ---
              <?xml version="1.0" encoding="ISO-8859-1"?>
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:media="media.xsd" xmlns="http://www.w3.org/1999/xhtml">
               <xsl:template match="/html/media:bild">
               wurde ersetzt
               </xsl:template>
              </xsl:stylesheet>

              Grüße
              Thomas

              1. Hallo Thomas,

                Es funktioniert leider nicht...
                <media:bild /> wird aber transformiert wenn es NICHT INNERHALB der <html> Tags steht! Ich hab den ganzen Tag daran rumprobiert und es scheint als könne man keine eigenen Tags wie gesagt innerhalb von <html> Tags mit XSLT transformieren lassen..

                alles was ich will ist in ein (X)HTML-Dokument meine eigenen Tags einfügen und diese dann mit XSLT umwandeln, es will aber partout nicht funktionieren. kennt jemand dieses Problem?

                1. Hallo,

                  Es funktioniert leider nicht...
                  <media:bild /> wird aber transformiert wenn es NICHT INNERHALB der <html> Tags steht!

                  Es lag am Namensraum.
                  versuche so: (http://example.com kannst du durch eine belibige URI ersetzen)

                  <?xml version="1.0" encoding="iso-8859-1"?>
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                  <?xml-stylesheet type="text/xsl" href="wilde.xsl"?>
                  <html xmlns="http://www.w3.org/1999/xhtml" xmlns:media="http://example.com" lang="de" xml:lang="de">
                   <media:bild />
                   <b>nur html</b>
                  </html>

                  --------------------
                  <?xml version="1.0" encoding="ISO-8859-1"?>
                  <xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:media="http://example.com">
                   <xsl:output
                    method="xml"
                    omit-xml-declaration="yes"
                    indent="yes"
                    encoding="iso-8859-1"
                    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
                    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />

                  <xsl:template match="* | @* | text()">
                    xsl:copy
                     <xsl:apply-templates select="@*" />
                     <xsl:apply-templates />
                    </xsl:copy>
                   </xsl:template>

                  <xsl:template match="media:bild">
                    <em>wurde ersetzt</em>
                   </xsl:template>
                  </xsl:stylesheet>

                  Grüße
                  Thomas

                  1. Es lag am Namensraum.

                    wunderbar, es läuft. Allerdings habe ich immer noch ein Problem:
                    meine eigenen Tags sollten in einer (möglicherweise nicht wohlgeformten) HTML-Umgebung eingesetzt werden können. Als XML-Datei kommt dann postwendend die erste Fehlermeldung, da HTML oftmals eben nicht wellformed ist. Sobald ich eine (X)HTML-Datei daraus mache kommen natürlich keine Fehlermeldungen mehr, aber leider funktionieren dann die XSLT Transformationen nicht mehr! Hast du vielleicht noch eine Idee, woran das nun wieder liegen kann? Ich hab keine Ahnung mehr...

                    Grüße
                    Thomas

                    Vielen Dank Thomas

                    1. Hallo,

                      wunderbar, es läuft. Allerdings habe ich immer noch ein Problem:
                      meine eigenen Tags sollten in einer (möglicherweise nicht wohlgeformten) HTML-Umgebung eingesetzt werden können. Als XML-Datei kommt dann postwendend die erste Fehlermeldung, da HTML oftmals eben nicht wellformed ist. Sobald ich eine (X)HTML-Datei daraus mache kommen natürlich keine Fehlermeldungen mehr, aber leider funktionieren dann die XSLT Transformationen nicht mehr! Hast du vielleicht noch eine Idee, woran das nun wieder liegen kann? Ich hab keine Ahnung mehr...

                      OK. Du hast also eine HTML-Datei innerhalb du eine XML/XSL-Tranformation ausführen willst. Du kannst dies (entweder mit den XML Data Island , oder) mit JavaScript lösen.

                      Führe dir folgende Beiträge zur Gemüte:
                      http://forum.de.selfhtml.org/archiv/2004/4/t78019/#m451662

                      Da wird die Transformation aus der HTML-Datei herus angestoßen bzw. beim onLoad ausgelöst.

                      http://forum.de.selfhtml.org/archiv/2005/1/t97848/#m597247

                      Da ist das Scrip schon verbessert, das kannst du auch in einer HTML-Datei verwenden, du brauchst lediglich auf die Teile mit den Parameter im Script zu verzichten und den Rest aus der "function show(nAbstrakt)" in der entsprechten Abfrage in der "funktion init()" zu stellen.

                      Also am Ende wirst/solltest du:

                      • eine HTML-Datei haben in der das JavaScript steht
                      • eine XML-Datei in der nur das steht, was du transformieren willst
                      • eine XSL-Datei was die Regel für die Transformation enthält.

                      Bei weiteren Fragen: fragst du halt nach ;-)

                      Grüße
                      Thomas

                      1. Hallo,

                        Ich habe das jetzt alles so mehr oder weniger hinbekommen wie ich mir das vorstellte, allerdings mit einem darauffolgenden kapitalen Problem: sobald mein <media:bild /> Tag transformiert wird, steht er auch nicht mehr als solches im Quelltext, sondern eben als <img> tag und um genau das ging es mir die ganze Zeit! Ich dachte mit XSLT ließe sich ein custom tag als zB <img> interpretieren lassen, bleibt aber selbst unverändert. Das wäre sehr wichtig gewesen, da ich somit innerhalb eines <div contenteditable></div> Layers einen kleinen wysiwyg Editor hätte aufbauen können, der meine eigenen Tags per innerHTML unverändert wieder zurückgibt.
                        Ich habe mich bereits nach professionellen Lösungen für "custom tags" umgeschaut und konnte a) nichts wirklich passendes finden und wenn dann waren sie b) alle mit Java Applets oder ActiveX aufgebaut und das würde ich doch gerne tunlichst vermeiden.

                        abschließende Frage: gibt es nun zu meinen Vorstellungen
                        -überhaupt einen Lösungsweg?
                        -einen Weg ohne Applets oder sonstige Plugins, am besten JS?

                        viele Grüße aus Berlin,
                        Alex

                        1. Hallo,

                          Langsam aber sicher verliere ich die Geduld.
                          Bitte sei so nett das nächte Mal dein Problem so genau wie möglich zu beschreiben. Es ist enorm läßtig, wenn die Informationen Stück für Stück aus dir "rausgequetscht" werden müssen um dir Helfen zu können.
                          Erst hieß es bei dir so, dann so, dann rückst du mit irgendeinem WYSIWYG und deren Custom-Tags aus.

                          Ich habe das jetzt alles so mehr oder weniger hinbekommen wie ich mir das vorstellte, allerdings mit einem darauffolgenden kapitalen Problem: sobald mein <media:bild /> Tag transformiert wird, steht er auch nicht mehr als solches im Quelltext, sondern eben als <img> tag

                          Ja: Das _ist_ die Tranformation. Punkt.

                          Ich dachte mit XSLT ließe sich ein custom tag als zB <img> interpretieren lassen, bleibt aber selbst unverändert.

                          Dann hast du falsch gedacht. Der Gedanke ist generell falsch, wenn es darum geht im Browser sowas zu machen. Browser verstehen HTML. Ende.
                          Alles andere muss am Server passieren, wo ein Script den Aufruf interpretiert und die entsprechenden aktionen ausführt, so das die Browser HTML bekommen. Aber XSLT ist für deine Probleme auch am Server nur dann eine Lösung, wenn du  ein Script/Software/Programm hast der z.B. Verarbeitungsanweisungen aus dem XSL-Sheet interpretieren und ausführen kann.

                          Das wäre sehr wichtig gewesen, da ich somit innerhalb eines <div contenteditable></div> Layers einen kleinen wysiwyg Editor hätte aufbauen können, der meine eigenen Tags per innerHTML unverändert wieder zurückgibt.

                          Dann hättest du dies als erstes sagen sollen!

                          abschließende Frage: gibt es nun zu meinen Vorstellungen
                          -überhaupt einen Lösungsweg?

                          Nein.

                          -einen Weg ohne Applets oder sonstige Plugins, am besten JS?

                          Nein. HTML ist HTML und kennt keine Cutom-Tags. Wenn im Seitenquelltext, dass der Browser erhält kein HTML steht wird es ignoriert. (Deshalb geht es ja nur mit Applets oder ActiveX)

                          Grüße
                          Thomas