Hansemann: Wie nehme ich "eigene" Tags in ein XHTML Dokument auf?

Liebes Forum,

ich möchte gerne eine XHTML-Datei an den Browser ausliefern, in der sich auch nicht-XHTML-konforme Tags befinden, die noch dazu in einem eigenen Namespace (txd:) definiert sind. Diese Tags sollen nach dem Laden des Dokuments clientseitig über Javascript weiterverarbeitet werden.

Beispiel:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:txd="http://www.domain.de/txd"
  xml:lang="en"
  lang="en">
  <head>
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
    <title>XHTML Test</title>
   </head>
  <body>
    <div id="id0">Content</div>
    <txd:panel test="text">
     TXD Content
    </txd:panel>
  </body>
</html>

Ich habe hier im html-Tag ja den Namespace über xmlns:txd deklariert, oder? Dennoch moppert Firefox "error: txd:panel is not recognized."

Nun habe ich allerdings auch keine dtd dazu geschrieben, weil ich a) nicht weiß, was da reingehört und b) ich gelesen habe, daß der Browser diese zur Validierung sowieso nicht heranzieht.

Was mache ich falsch?

Vielen Dank für alle Anmerkungen,
Gruß,
Hansemann

  1. Hallo Hansemann,

    XHTML 1.0 sieht keinen Mechanismus zur Erweiterung vor, mit Modularization of XHTML geht so etwas prinzipiell aber.

    Das wird aber natürlich nicht dazu führen, dass irgend ein Browser mit Deinen Elementen etwas anfangen kann. Die Syntax ist dann zwar definiert, aber die Semantik natürlich nicht.

    Was hast Du denn genau vor?

    Grüße

    Daniel

    1. Hallo Daniel,

      XHTML 1.0 sieht keinen Mechanismus zur Erweiterung vor, mit Modularization of XHTML geht so etwas prinzipiell aber.

      Das schau ich mir mal genauer an.

      Das wird aber natürlich nicht dazu führen, dass irgend ein Browser mit Deinen Elementen etwas anfangen kann. Die Syntax ist dann zwar definiert, aber die Semantik natürlich nicht.
      Was hast Du denn genau vor?

      Ich will eine Javascript-GUI-Library schreiben, über die einzelne Elemente (bzw. deren Inhalt) über XMLHTTPRequests nachgeladen werden können. Wenn man so will, ein Mini-XUL-Subset.

      Funktionell liegt ein großer Teil dessen bereits vor, nur arbeite ich dabei noch mit HTML-Elementen (vorwiegend <divs>). Ich möchte das nun aber angelehnt an die XUL-Syntax umschreiben, d.h. ich liefere XML-Source Code aus, z.B.

      <menubar>
        <menuitem label="Ansicht"/>
      <menubar>

      Diesen Source möchte ich via XSLT und Javascript in valides XHTML und entsprechende Javascript Objekte zur Ansteuerung und zum EventHandling clientseitig "umbauen". Der Weg dahin ist allerdings noch unklar... :)

      Vielen Dank und Gruß,
      Hansemann

      1. Hallo Hansemann,

        Dafür wäre ein XHTML Modul meiner Meinung nach eine sehr elegante Lösung.
        Browserunterstüzung spielt in dem Fall ja keine Rolle, wenn Du das vorher mit XSLT übersetzt.

        Das W3C arbeitet auch an einer überarbeiteten Fassung: < http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/>
        Da solltest Du vielleicht auch rein gucken, vor allem, falls Du statt DTDs Schemata nutzen willst.
        (Verwendung von Namensräumen ist mit DTDs immer ein Bisschen eklig, da sie diese eigentlich nicht unterstüzen)

        Grüße

        Daniel

    2. Hallo,

      XHTML 1.0 sieht keinen Mechanismus zur Erweiterung vor,

      Nur interessehalber:
      In http://forum.de.selfhtml.org/archiv/2006/1/t120835/ hat das aber jemand "just for fun" mal gemacht. Er hat per "Erweiterung" der DTD TABLE-Elemente in A-Elementen erlaubt. Auch ich bekomme das hier angegebene XHTML zumindest Validome-valide ;-)

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
      [ <!ELEMENT body (div | txd:panel)* >
        <!ATTLIST html
          xmlns CDATA #FIXED 'http://www.w3.org/1999/xhtml'
          xmlns:txd CDATA #FIXED 'http://www.domain.de/txd'
          xml:lang CDATA #IMPLIED
        >
        <!ELEMENT txd:panel (#PCDATA)* >
        <!ATTLIST txd:panel test CDATA #IMPLIED >
      ]>
      <html  xmlns="http://www.w3.org/1999/xhtml"
        xmlns:txd="http://www.domain.de/txd"
        xml:lang="en"
        lang="en">
        <head>
          <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
          <title>XHTML Test</title>
         </head>
        <body>
          <div id="id0">Content</div>
          <txd:panel test="text">
           TXD Content
          </txd:panel>
        </body>
      </html>

      Das das natürlich _so_ Unsinn ist, weil man alle Entities (%Flow; %Block; ...) nicht verwenden kann bzw. nochmal separat definieren müsste, weswegen in meinem BODY jetzt z.B. wirklich _nur_ DIV oder TXD:PANEL erlaubt sind, ist klar. Aber steht irdendwo, dass es _prinzipiell_ nicht geht?

      viele Grüße

      Axel

      1. Hallo Axel,

        Ja natürlich geht das. Allerdings ist das dann kein XHTML 1.0 mehr.
        < http://www.w3.org/TR/xhtml1/#strict> verlangt nicht nur das einbinden der DTD sondern auch, dass das Dokuemt dieser entspricht. Das ist so nicht mehr der Fall.
        Man kann natürlich eine eigene DTD schreiben und XHTML und andere Elemente dann kombinieren. XHTML 1.0 + MathML ist ja ein Beispiel, dass das W3C das selber macht. Einen definierten Weg, XHTML zu erweitern gibt es aber in Version 1.0 nicht.
        Wenn man XHTML für irgend welche Zwecke erweitern will, ist modularisiertes XHTML also sicher der bessere Ansatz.

        Grüße

        Daniel

        1. Hallo,

          Ja natürlich geht das. Allerdings ist das dann kein XHTML 1.0 mehr.

          Ja, das ist klar.

          Man kann natürlich eine eigene DTD schreiben und XHTML und andere Elemente dann kombinieren.

          Was mich irritiert ist, dass scheinbar eine externe DTD, nämlich:

          PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

          mit einer internen DTD, nämlich:

          [ <!ELEMENT body (div | txd:panel)* >
            <!ATTLIST html
              xmlns CDATA #FIXED 'http://www.w3.org/1999/xhtml'
              xmlns:txd CDATA #FIXED 'http://www.domain.de/txd'
              xml:lang CDATA #IMPLIED
            >
            <!ELEMENT txd:panel (#PCDATA)* >
            <!ATTLIST txd:panel test CDATA #IMPLIED >
          ]

          gemeinsam _einen_ Dokumenttyp "DOCTYPE html" beschreiben und der Parser des Validators das so schluckt. Das dem so ist, erkennt man daran, dass der Validator die Elemente und Attribute aus "DTD XHTML 1.0 Strict" kennt und um die intern beschriebenen erweitert bzw. die Element- und Attributdefinitionen von "DTD XHTML 1.0 Strict" durch die intern beschriebenen ersetzt, wenn es sich um die selben handelt. Dazu habe ich bisher noch nirgendwo etwas gefunden. Bisher dachte ich, dass hierfür entweder oder gilt. Wenn das aber offiziell so geht, warum werden dann die Entities (z.B. %Flow; %Block; ...) aus der "DTD XHTML 1.0 Strict" intern nicht erkannt und verwendet?

          XHTML 1.0 + MathML ist ja ein Beispiel, dass das W3C das selber macht.

          Du meinst http://www.w3.org/TR/xhtml1/#well-formed? Aber welcher DOCTYPE soll da drüber stehen?

          Wenn man XHTML für irgend welche Zwecke erweitern will, ist modularisiertes XHTML also sicher der bessere Ansatz.

          Ja.

          viele Grüße

          Axel

          1. Hallo Axel,

            Dazu habe ich bisher noch nirgendwo etwas gefunden.

            Dann solltest Du die XML-Spezifikation lesen.

            "If both the external and internal subsets are used, the internal subset MUST be considered to occur before the external subset. This has the effect that entity and attribute-list declarations in the internal subset take precedence over those in the external subset."
            Quelle: < http://www.w3.org/TR/REC-xml/#sec-prolog-dtd> letzter Absatz.

            Wenn man wissen will, wie irgend was wirklich festgelegt ist, sollte man in die Spezifikationen gucken. Dokumentationen wie Selfhtml sind zwar oft einfacher verständlich, aber eben oft auch etwas ungenau.

            Wenn das aber offiziell so geht, warum werden dann die Entities (z.B. %Flow; %Block; ...) aus der "DTD XHTML 1.0 Strict" intern nicht erkannt und verwendet?

            Weil sie eben noch nicht definiert sind. Du kannst dafür aber intern Entities überschreiben, die in einer externen DTD benutzt werden.

            XHTML 1.0 + MathML ist ja ein Beispiel, dass das W3C das selber macht.
            Aber welcher DOCTYPE soll da drüber stehen?

            Ich sehe gerade, dass das tatsächlich XHTML 1.1 + MathML ist und daher wohl auch auf der Modularisierung aufbaut. Die XHTML 1.0 Recommendation verweist zwar darauf als Beispiel aber das ist entweder falsch oder diese DTD wurde geändert nachdem XHTML 1.1 erschienen ist.
            XHTML-Modularization legt fest, wie sich Doktypes zusammensetzen. Für XHTML 1.0 würde gelten: Ein eigener Doctype entsprechend dem dafür geltenden Standard. Gibt dafür glaube ich irgend ein RFC oder sowas.

            Grüße

            Daniel

            1. Hallo,

              Dazu habe ich bisher noch nirgendwo etwas gefunden.
              Dann solltest Du die XML-Spezifikation lesen.
              Wenn man wissen will, wie irgend was wirklich festgelegt ist, sollte man in die Spezifikationen gucken.

              Ja, ist ja gut nun ;-)).

              Quelle: http://www.w3.org/TR/REC-xml/#sec-prolog-dtd letzter Absatz.

              Danke, nun ist es klar.

              viele Grüße

              Axel