Daniel N.: "CDATA" in XHTML

Hallo,

ich bin davon ausgegangen, dass ich in einer XHTML-Datei auch das
Konstrukt "![CDATA[ xxx ]]" nutzen kann.

In dem folgenden kleinen Beispiel verwende ich dieses innerhalb eines Paragraphen und innerhalb von <pre>.
Tidy meldet keine Fehler und keine Warungen, der beihaltete Text wird nur im Browser leider nicht angezeigt!

Wo ist der Fehler?

  
<?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">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<title>Test</title>  
</head>  
  
<body>  
  
<p><![CDATA[Dieses ist "CDATA" in einem normalen Absatz.]]></p>  
  
<pre><![CDATA[Dieses ist bereits formatierter  
Text, der u. a. feste  
Zielenumbrüche enthält.]]>  
</pre>  
  
</body>  
</html>  

Vielen Dank und viele Grüße
Daniel

  1. Hallo,

    ich bin davon ausgegangen, dass ich in einer XHTML-Datei auch das
    Konstrukt "![CDATA[ xxx ]]" nutzen kann.

    Ja, in XHTML mit Content-Type: application/xhtml+xml.

    Tidy meldet keine Fehler und keine Warungen, der beihaltete Text wird nur im Browser leider nicht angezeigt!

    Doch, im Firefox und Opera schon, eben nur mit Content-Type: application/xhtml+xml.

    Wo ist der Fehler?

    Nichts desto trotz darf in XHTML in den Elementen P und PRE natürlich kein CDATA stehen.

    http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
    ...
    <!ELEMENT p %Inline;>
    ...
    <!ELEMENT pre %pre.content;>
    ...
    ...
    <!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
    ...
    <!ENTITY % pre.content
       "(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline;
          | %inline.forms;)*">
    ...
    usw.

    viele Grüße

    Axel

    1. Hallo,

      Ja, in XHTML mit Content-Type: application/xhtml+xml.

      ...

      Tidy meldet keine Fehler und keine Warungen, der beihaltete Text wird nur im Browser leider nicht angezeigt!
      Doch, im Firefox und Opera schon, eben nur mit Content-Type: application/xhtml+xml.

      Das Tidy in meinem Firefox meldet keine Fehler, auch nicht wenn ich den Content-Type wie folgt angebe?!

        
      <meta http-equiv="content-type" content="application/xhtml+xml; charset=ISO-8859-1" />  
      
      

      Nichts desto trotz darf in XHTML in den Elementen P und PRE natürlich kein CDATA stehen.

      Das hatte ich übersehen, bzw. erwartet, dass Tidy mir das meldet?!

      Viele Grüße
      Daniel

      1. Hallo,

        Ja, in XHTML mit Content-Type: application/xhtml+xml.

        Tidy meldet keine Fehler und keine Warungen, der beihaltete Text wird nur im Browser leider nicht angezeigt!
        Doch, im Firefox und Opera schon, eben nur mit Content-Type: application/xhtml+xml.
        Das Tidy in meinem Firefox meldet keine Fehler, auch nicht wenn ich den Content-Type wie folgt angebe?!

        Nein, ich meinte, wenn Du es mit diesem Content-Type auslieferst, wird es angezeigt. Fehler sind nicht zu melden (siehe Gunnar).

          
        
        > <meta http-equiv="content-type" content="application/xhtml+xml; charset=ISO-8859-1" />  
        
        

        Nein, das reicht nicht. Der Server muss es mit Content-Type: application/xhtml+xml ausliefern.

        Nichts desto trotz darf in XHTML in den Elementen P und PRE natürlich kein CDATA stehen.

        Nein, darf es doch, #PCDATA enthält CDATA, siehe Gunnar.

        viele Grüße

        Axel

    2. Hello out there!

      Nichts desto trotz darf in XHTML in den Elementen P und PRE natürlich kein CDATA stehen.

      ?? Na aber doch.

      <![CDATA[foo]]> ist doch PCDATA. Sonst würde der Parser bei der Zeichenfolge '<!' kein Start-Tag erkennen, sondern diese darstellen.

      „CDATA-Abschnitte  dürfen überall dort stehen, wo auch Zeichendaten erlaubt sind.“ [XML10 §2.7]

      http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
      <!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
      <!ENTITY % pre.content
         "(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline;
            | %inline.forms;)*">

      Dort steht auch
      <!ELEMENT script (#PCDATA)>

      Und script darf selbstverstandlich auch CDATA-Bereiche enthalten.

      See ya up the road,
      Gunnar

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

      Nichts desto trotz darf in XHTML in den Elementen P und PRE natürlich kein CDATA stehen.

      Zitat aus der XML Spezifikation:

      „CDATA sections MAY occur anywhere character data may occur; ...“

      <!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">

      CDATA-Sektionen sind hier schon in dem Stichwort #PCDATA enthalten. Wenn Du meinst, es gäbe ein analoges Stichwort #CDATA, muss ich Dich enttäuschen (Achtung: nicht mit dem Attributwert CDATA verwechseln.) Auch in XHTML 1 sind CDATA-Sektionen überall dort erlaubt, wo #PCDATA erlaubt ist.

      Nur: Die Browser scheinen sich uneinig zu sein, ob sie CDATA-Inhalt wie von der DOM Spezifikation gefordert als Textknoten in den DOM-Baum einbasteln (und folglich auch darstellen) sollen. Meine Schnelltests mit einer XML/XHTML-Datei und Ian Hicksons Live DOM Viewer ergaben dieses Resultat:

      Safari 2.0  – Wird nicht dargestellt, nicht im DOM-Baum vorhanden
      Firefox 1.5 – Wird dargestellt, im DOM-Baum vorhanden
      Opera 8.5   – Wird dargestellt, im DOM-Baum vorhanden

      Wie das im Internet Explorer ist, muss jemand überprüfen, der einen IE zur Hand hat.

      Daniel: Ich vermute, Du hast ein einem Browser getestet, der CDATA-Sektionen nicht als Textknoten interpretiert. Ist ein eher schwaches Ergebnis. Ich würde Dir daher empfehlen, CDATA-Sektionen in XHTML nicht einzusetzen, sondern „traditionelle“ Maskierung mittels &lt; vorzunehmen, wenn Du Markup darstellen willst.

      Tim