shuthichi: XSL + JavaScript nach xhtml strict

Hallo Forum,

nachdem ich heute bemerkt habe dass ich zwar den DOCTYPE xhtml strict verwende, meinen XSL Prozessor aber mit "output-method=html" füttere und dieser dadurch sämtliche Tags nicht ordnungsgemäß schließt, habe ich dies per "output-method=xml" geändert. Quelle: objectsbydesign.com

Mein xsl-file Header schaut jetzt also so aus:

<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
   <xsl:output method="html" version="1.0" indent="yes" encoding="utf-8" media-type="text/html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>  

Dadurch werden jetzt sämmtliche Tags richtig geschlossen wie ich das erwartet hatte.

Aber seither findet der Browser angeblich sämmtliches Javascript nicht mehr. Genauer gesagt die JavaScript Teile die inline deklariert sind, also in keiner externen *.js Datei.

Ich habe im xsl einiges JavaScript welches ich auch nicht einfach dort rausnehmen kann weil es dynamisch verändert wird.

Sämmtliche Versuche das Inline JavaScript zu maskieren sind fehlgeschlagen.

Jetzt meine Frage: Kann das überhaupt funktionieren mit dem DocType xhtml strict.

Das W3C beschreibt die Vorgehensweise so:

<script type="text/javascript">  
<![CDATA[  
... unescaped script content ...  
]]>  
</script>  

Aber mein Browser sagt: Funktion xy nicht definiert. Wenn ich den Seitenquelltext öffne sehe ich das JavaScript aber inkl. der "nicht definierten Funktion"

Ich stehe auf dem Schlauch. Kann mir jemand weiterhelfen? Ist es möglich dass der Browser beim DOCTYPE xhtml strict einfach inline script Tags ignoriert?

Grüße shuthichi

  1. Hallo shuthichi,

    Mein xsl-file Header schaut jetzt also so aus:

    <?xml version="1.0" encoding="utf-8"?>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="html" version="1.0" indent="yes" encoding="utf-8" media-type="text/html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

      
    Setze die Ausgabemethode auf "xml" und verwende bei xsl:output zusätzlich cdata-section-elements="script". Falls das nicht hilft, erstelle die CDATA-Abschnitte manuell.  
      
    Grüße,  
    Thomas
    
    1. Hallo Thomas,

      Die output-method=xml hatte ich bereits. Das hab ich hier gestern Abend falsch beschrieben. Meine CDATA Abschnitte habe ich auch alle manuell erstellt. Nutze die cdata-section-elements="script" also nicht.
      Das Problem waren / sind meine JavaScript Includes:
      <script type="text/javascript" src="scripts/external/blabla.js"></script>

      Durch die output-method=xml schließt der XSL Prozessor wohl die script-tags so:
      <script type="text/javascript" src="scripts/external/blabla.js"/>

      Und das ist dann ja nicht mehr xhtml konform. Bitte korrigieren wenn ich da flasch liege.

      Wenn ich jetzt so etwas hässliches mache, dann läuft es:
      <script type="text/javascript" src="scripts/external/blabla.js">var ofsiw = 0;</script>

      So schließt er jetzt das script Tag richtig... Gibts hier ne bessere Alternative?

      Ein Problem habe ich noch. In einem Inline script wird der Operator "<" nach &lt; konvertiert. Die Frage ist aber warum, denn das Script steht in einem CDATA Abschnitt.

      <script type="text/javascript">  
      <![CDATA[  
      function function_xy(){  
      	if(a < b){  
      		alert("Bla");  
      	}  
      }  
      ]]>  
      </script>
      

      Was kann ich dagegen tun?

      Gruß shuthichi

      1. Hallo shuthichi,

        Durch die output-method=xml schließt der XSL Prozessor wohl die script-tags so:
        <script type="text/javascript" src="scripts/external/blabla.js"/>

        Alternative:
        <xsl:text disable-output-escaping="yes">&lt;script type="text/javascript" src="test.js">&lt;/script></xsl:text>

        Ein Problem habe ich noch. In einem Inline script wird der Operator "<" nach &lt; konvertiert. Die Frage ist aber warum, denn das Script steht in einem CDATA Abschnitt.

        <script type="text/javascript">

        <![CDATA[
        function function_xy(){
        if(a < b){
        alert("Bla");
        }
        }
        ]]>
        </script>

        
        >   
        > Was kann ich dagegen tun?  
          
        Genau hier hilft das genannte Attribut cdata-section-elements="script". Im XSLT-Stylesheet ist der CDATA-Abschnitt zwar korrekt, allerdings wird dieser ja auch in der Ausgabe benötigt und muss entsprechend erzeugt werden.  
          
        Grüße,  
        Thomas
        
        1. Genau hier hilft das genannte Attribut cdata-section-elements="script". Im XSLT-Stylesheet ist der CDATA-Abschnitt zwar korrekt, allerdings wird dieser ja auch in der Ausgabe benötigt und muss entsprechend erzeugt werden.

          Grüße,
          Thomas

          Hi Thomas,

          mein Problem ist aber dass ich das JavaScript im XSL dynamisch aufbaue. Deshalb kann ich die option cdata-section-elements="script" nicht setzten, oder?

          1. Hallo shuthichi,

            mein Problem ist aber dass ich das JavaScript im XSL dynamisch aufbaue. Deshalb kann ich die option cdata-section-elements="script" nicht setzten, oder?

            hast Du es probiert? Alternativ wäre auch diese Schreibweise möglich:

            <script type="text/javascript">  
            <xsl:text disable-output-escaping="yes">&lt;![CDATA[  
            function function_xy(){  
                    if(a &lt; b){  
                            alert("Bla");  
                    }  
            }  
            ]]&gt;</xsl:text>  
            </script>
            

            Ergebnis:

            <script type="text/javascript"><![CDATA[  
            function function_xy(){  
                    if(a < b){  
                            alert("Bla");  
                    }  
            }  
            ]]></script>
            

            Grüße,
            Thomas

            1. » hast Du es probiert?

              Ja, aber es hat nicht funktioniert.

              » Alternativ wäre auch diese Schreibweise möglich:
              »
              » ~~~xml <script type="text/javascript">
              » <xsl:text disable-output-escaping="yes">&lt;![CDATA[
              » function function_xy(){
              »         if(a &lt; b){
              »                 alert("Bla");
              »         }
              » }»» ]]&gt;</xsl:text>
              » </script>

                
              Aber die Alternative hat funktioniert \*freu\*  
                
              Danke dir!
              
  2. Sorry, oben hat sich im xsl-Header natürlich ein Fehler eingeschlichen! Mein xsl-Header sieht so aus:

    <?xml version="1.0" encoding="utf-8"?>  
      
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
       <xsl:output method="xml" version="1.0" indent="yes" encoding="utf-8" media-type="text/html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
    

    Bin um jeden Tip dankbar!

    Grüße shuthichi