Jo73: XML-Datei wird trotz CSS unformatiert im Browser angzeigt

Hallo zusammen,

ich habe ein Problem bei der Umsetzung von CSS via XSL und PHP. Die Formatierungen über CSS werden in der ausgebenden PHP-Datei überhaupt nicht angzeigt. Ich kann machen was ich will. Vielleicht stimmt etwas nicht in mit dem Stylesheet/www.w3.org? Die XSL-Datei habe ich wie folgt programmiert:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
  <xsl:output method="html" version="4.0" indent="yes" encoding="UTF-8" media-type="text/html"/>
  <xsl:template match="xyz">
    <html>

<head>
        <title>
          <xsl:value-of select="title"/>
        </title>
        <style type="text/css">
        .ueberschrift { font-family:Verdana; font-style:normal; font-weight: bolder; }
        .parameter { font-family:Verdana; font-style:normal; font-size:70%; }
        .haupttext { font-family:Verdana; font-style:normal; font-size:100%; }
        </style>
      </head>

<body>
      <p><span class="ueberschrift">
          <xsl:value-of select="title "/>
        </span>
        </p>
       <p><span class="parameter">
          Datum:  <xsl:value-of select="storydate"/>
          Uhrzeit:  <xsl:value-of select="storytime"/>
        </span>
        </p>
       <p><span class="haupttext">
          <xsl:value-of select="subtext"/>
          <xsl:value-of select="fulltext"/>
        </span></p>

</body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Wäre klasse, wenn mir hier jemand weiterhelfen könnte, da eine unformatierte XML-Datei nicht so schön ist.

Schon vorab vielen Dank.

Gruß

Jo

  1. Hellihello Jo73,

    Dein Problem kapiere ich nicht. XML wird in Deinem Fall mittels XLS in ein HTML-Dokument umgeschrieben.

    a) wie parsed (oder wie heißt das?) Du das xml - Dokument
    b) wie sieht die XML-Quelle aus
    c) wie sieht die HTML-Ausgabe aus?

    Gruß,

    frankx

    1. ...das ganze ist wie folgt aufgebaut:

      Die XML-Datei:

      <?xml version="1.0" encoding="UTF-8" ?>
      <root>
      <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
      <ElementType name="xyz" content="mixed" model="closed">
      <element type="version" />
      <element type="uniqueid" />
      <element type="chainhistory" />
      <element type="title" />
      <element type="storydate" />
      <element type="storytime" />
      <element type="codes" />
      <element type="subtext" />
      <element type="fulltext" />
      </ElementType>
      <ElementType name="version" content="textOnly" model="closed" dt:type="number" />
      <ElementType name="uniqueid" content="textOnly" model="closed" dt:type="string" />
      <ElementType name="chainhistory" content="textOnly" model="closed" dt:type="string" />
      <ElementType name="title" content="textOnly" model="closed" dt:type="string" />
      <ElementType name="storydate" content="textOnly" model="closed" dt:type="date" />
      <ElementType name="storytime" content="textOnly" model="closed" dt:type="time" />
      <ElementType name="codes" content="mixed" model="closed">
      <AttributeType name="codetype" dt:type="enumeration" dt:values="country subject other" />
      <attribute type="codetype" required="yes" />
      </ElementType>
      <ElementType name="subtext" content="textOnly" model="closed" dt:type="string" />
      <ElementType name="fulltext" content="textOnly" model="closed" dt:type="string" />
      </Schema>
      <DJStory>
      <version>1.0</version>
      <uniqueid>2007</uniqueid>
      <chainhistory>2007</chainhistory>
      <title>
      <![CDATA[Text]]>
      </title>
      <storydate>2007-11-16</storydate>
      <storytime>17:12</storytime>
      <codes codetype="country">R/EC,R/EU,R/GE,R/WEU</codes>
      <codes codetype="subject">N/DJGE,N/CNW,N</codes>
      <codes codetype="industry">I/SCR</codes>
      <codes codetype="other"></codes>
      <subtext/>
      <fulltext><![CDATA[<FONT FACE="Arial" class="NormalMinus1">
      <p>
      Text
      </p>
      <pre>

      Text

      </pre>
      <p>
        (END) Text
      </p>
      <p>
        Datum
      </p>
      </FONT>]]>
      </fulltext>
      </xyz>
      </root>

      Das Parsen mit einer XSL-Datei:

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
        <xsl:output method="html" version="4.0" indent="yes" encoding="UTF-8" media-type="text/html"/>
        <xsl:template match="xyz">
          <html>

      <head>
              <title>
                <xsl:value-of select="title"/>
              </title>
              <style type="text/css">
              .ueberschrift { font-family:Verdana; font-style:normal; font-weight: bolder; }
              .parameter { font-family:Verdana; font-style:normal; font-size:70%; }
              .haupttext { font-family:Verdana; font-style:normal; font-size:100%; }
              </style>
            </head>

      <body>
            <p><span class="ueberschrift">
                <xsl:value-of select="title "/>
              </span>
              </p>
             <p><span class="parameter">
                Datum:  <xsl:value-of select="storydate"/>
                Uhrzeit:  <xsl:value-of select="storytime"/>
              </span>
              </p>
             <p><span class="haupttext">
                <xsl:value-of select="subtext"/>
                <xsl:value-of select="fulltext"/>
              </span></p>

      </body>
          </html>
        </xsl:template>
      </xsl:stylesheet>

      Die Ausgabe mittels einer PHP-Datei (nur dieser Ausschnitt ist auch dargestellt):

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

      <Html>
      <HEAD>

      .......

      <?php

      // Create an XSLT processor
       $xsltproc = xslt_create();

      // Perform the transformation
       $html1 = xslt_process($xsltproc, 'news.xml', 'news.xsl');

      // Perform the transformation
       $html2 = xslt_process($xsltproc, 'news2.xml', 'news2.xsl');

      // Detect errors
       if (!$html1) die('XSLT processing error: '.xslt_error($xsltproc));

      // Destroy the XSLT processor
       xslt_free($xsltproc);

      // Output the resulting HTML
       echo html_entity_decode($html1,ENT_QUOTES);

      // Detect errors
       if (!$html2) die('XSLT processing error: '.xslt_error($xsltproc));

      // Output the resulting HTML
       echo html_entity_decode($html2,ENT_QUOTES);

      ?>

      Damit wäre nun der Zusammenhang hergestellt mit dem Problem, dass die Website Frontend PHP-Datei die XML-Dokumente unformatiert darstellt.

      Ich hoffe dies erklärt das Problem besser.

      Gruß

      Jo

      Hellihello Jo73,

      Dein Problem kapiere ich nicht. XML wird in Deinem Fall mittels XLS in ein HTML-Dokument umgeschrieben.

      a) wie parsed (oder wie heißt das?) Du das xml - Dokument
      b) wie sieht die XML-Quelle aus
      c) wie sieht die HTML-Ausgabe aus?

      Gruß,

      frankx

      1. Hellihello,

        na dein problem ist ja wohl, dass das php nicht html-code ausspuckt sondern das xml, wenn ich das recht verstehe.

        was du willst ist doch eine html-ausgabe. der siehst du nach dem parsten durch phps xslt-prozessor überhaupt nicht mehr an, auf welche weise sie erstellt wurde. nix xml mehr. interssant ist also entweder
        a) wie der ausgegebene html-quelltext aussieht
        b) warum er vielleicht nicht so aussieht wie erwartet

        könnte es sein, dass du das xml ungeparsed ausgibst?

        weiterer tipp:

        nimm eine zeile xml, eine zeile xsl, sowenig php wie nötig und teste. dann übertrage das ergebnis auf deine zig-zeilen.

        Dank und Gruß,

        frankx

        1. ...ein paar Verständisfragen:

          Hellihello,

          na dein problem ist ja wohl, dass das php nicht html-code ausspuckt sondern das xml, wenn ich das recht verstehe.

          »»

          die php spuckt mehr oder weniger die ursprüngliche xml aus, natürlich im html Format

          was du willst ist doch eine html-ausgabe. der siehst du nach dem parsten durch phps xslt-prozessor überhaupt nicht mehr an, auf welche weise sie erstellt wurde. nix xml mehr. interssant ist also entweder
          a) wie der ausgegebene html-quelltext aussieht
          b) warum er vielleicht nicht so aussieht wie erwartet

          »»

          hier trifft b) zu

          könnte es sein, dass du das xml ungeparsed ausgibst?

          »»

          ich dachte ich parse mit der XSL-Datei, oder nicht? Was muß man hier genau machen? Die Struktur kennst Du ja genau aus dem letzten Beitrag

          weiterer tipp:

          nimm eine zeile xml, eine zeile xsl, sowenig php wie nötig und teste. dann übertrage das ergebnis auf deine zig-zeilen.

          »»

          habe ich bereits gemacht, aber keine Veränderungen in der Ausgabe festgestellt

          Dank und Gruß,

          frankx

          Kann es sein, das bei mir mit der sog. dtd etwas nicht stimmt (strict, 1.0, XMLT, etc.)?

          Vielleicht hast Du ja noch einen konkreten Programmiervorschlag? Ich bin nicht gerade ein Profi in der Thematik.

          Danke

          Gruß

          Jo

          1. Hellihello Jo73

            die php spuckt mehr oder weniger die ursprüngliche xml aus, natürlich im html Format

            also natürlich ists hier aus meiner sicht nix.

            1. hast du xml-datei - wenn die nicht stimmt (s.rouven), dann meckert php, dass die nicht korrekt ist
            2. du hast eine xsl-datei. die sagt: wenn da ein element ist mit dem namen xyz, dann schreibe davor irgendwas und meinethalben dannach auch.
            3. du hast php, dass sowohl die daten-xml-datei wie auch die xsl-xml-datei einliest und die xsl auf die xml "anwendet"

            jetzt kann es zb. sein, dass du in deiner xsl datei nach matches suchst (<abc/>) die in deiner xml-datei garnicht vorhanden sind. in der regel wird dann das ungefiltert ausgegeben, was nicht durch die xsl neu definiert wurde.

            deshalb: bau dir das mal mit zwei bausteinchen zusammen und schau was passiert, wäre mein tipp.

            was du willst ist doch eine html-ausgabe. der siehst du nach dem parsten durch phps xslt-prozessor überhaupt nicht mehr an, auf welche weise sie erstellt wurde. nix xml mehr. interssant ist also entweder
            a) wie der ausgegebene html-quelltext aussieht
            b) warum er vielleicht nicht so aussieht wie erwartet
            »»

            hier trifft b) zu

            also sind vielleicht ein der xsl nicht die passenden elemente selektiert.

            könnte es sein, dass du das xml ungeparsed ausgibst?
            »»

            ich dachte ich parse mit der XSL-Datei, oder nicht? Was muß man hier genau machen? Die Struktur kennst Du ja genau aus dem letzten Beitrag

            na, wird schon sein, sonst würde php ja meckern. du siehst es ja daran, dass zumindest irgendwas aus der xsl-datei in der transformierten=ausgabe steht.

            weiterer tipp:

            nimm eine zeile xml, eine zeile xsl, sowenig php wie nötig und teste. dann übertrage das ergebnis auf deine zig-zeilen.
            »»

            habe ich bereits gemacht, aber keine Veränderungen in der Ausgabe festgestellt

            nun, wenn du diese ministücke posten würdest, könntest du mit hillfe rechnen. schön wäre auch, wenn du syntaxhighlightning benutzen würdest...

            [code lang=xml/php]

            ... dein code

            [/coode]

            ... schließender tag nur mit einem o versteht sich, s.a. hilfe.

            Kann es sein, das bei mir mit der sog. dtd etwas nicht stimmt (strict, 1.0, XMLT, etc.)?

            nee. wenn die bentutzt wird von php bedeutet das nur, dass php die gülitigkeit des xml checked. ists nicht gültig / regelkonform zu dtd gibts einen fehler und feierabend.

            Vielleicht hast Du ja noch einen konkreten Programmiervorschlag? Ich bin nicht gerade ein Profi in der Thematik.

            s.o.

            Dank und Gruß,

            frankx

            1. Hallo frankx,

              vielen Dank für Deine Unterstützung. Ich bin aber ein bisschen ratlos was ich noch zusätzlich posten könnte, da ich sowohl die komplette XML, XSL und PHP-Datei bereits eingestellt habe (siehe früherer Beitrag).

              Der XML-Beitrag wird auch eins zu eins ausgeworfen wie ich mir es wünsche, dass einzige Problem ist eigentlich nur, dass die Formartierung über css nicht so dargestellt wird wie ich es in der XSL definiert habe.

              Vielleicht könntest Du dir die Dateien noch einmal anschauen und hättest eine Tipp.

              Schon vorab vielen Dank.

              Gruß

              Jo

              1. Hellihello Jo73,

                ich glaube, du hast nicht recht verstanden:

                vielen Dank für Deine Unterstützung. Ich bin aber ein bisschen ratlos was ich noch zusätzlich posten könnte, da ich sowohl die komplette XML, XSL und PHP-Datei bereits eingestellt habe (siehe früherer Beitrag).

                genau, zuviel Quelltext lese ich mit selten durch. Zumal beim eindampfen des Problems auf das Wesentliche zu 50% die Lösung automatisch abfällt.

                Der XML-Beitrag wird auch eins zu eins ausgeworfen wie ich mir es wünsche, dass einzige Problem ist eigentlich nur, dass die Formartierung über css nicht so dargestellt wird wie ich es in der XSL definiert habe.

                Du verwechselst da etwas vermute ich. CSS hat damit _nichts_ zu tun. Mit dem XSL schreibst Du das XML um, komplett u.u.. Wo vorher <autor>Hans Müller</autor> im XML stand, steht dannach <p>Hans Müllery</p> oder so. Wenn Du im Quelltext XML siehst, hat die Transformation mit XSL nicht geklappt. XSL bedeutet: nimm XML und mach daraus HTML in deinem Fall. Das Ergebnis muss komplett reines HTML sein.

                Vielleicht könntest Du dir die Dateien noch einmal anschauen und hättest eine Tipp.

                Mehr als o.g. leider nein. Bastel, wie erwähnt, ein kleines Beispiel und wir sehen weiter.

                Dank und Gruß,

                frankx

                1. Hellihello...,

                  Du verwechselst da etwas vermute ich. CSS hat damit _nichts_ zu tun. Mit dem XSL schreibst Du das XML um, komplett u.u.. Wo vorher <autor>Hans Müller</autor> im XML stand, steht dannach <p>Hans Müllery</p> oder so. Wenn Du im Quelltext XML siehst, hat die Transformation mit XSL nicht geklappt. XSL bedeutet: nimm XML und mach daraus HTML in deinem Fall. Das Ergebnis muss komplett reines HTML sein.

                  Vielleicht könntest Du dir die Dateien noch einmal anschauen und hättest eine Tipp.

                  Mehr als o.g. leider nein. Bastel, wie erwähnt, ein kleines Beispiel und wir sehen weiter.

                  In etwas so:

                    
                  <?php  
                    
                  $examplexml='  
                  <surround>  
                  <inner>  
                   <element1>Textknoten in Element1</element1>  
                   <element2>Textknoten in Element2</element2>  
                  </inner>  
                  </surround>';  
                    
                    
                  $examplexsl='  
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
                  <xsl:template match="surround">  
                   Schreib dies mal vor den Inhalt von des Elementes surround.  
                   <xsl:apply-templates/>  
                  </xsl:template>  
                  <xsl:template match="inner">  
                   <h1><xsl:value-of select="element1"/></h1>  
                   <h2>by <xsl:value-of select="element2"/></h2>  
                  </xsl:template>  
                  </xsl:stylesheet>  
                  ';  
                    
                  /* Load the two XML sources */  
                  $xml = new DomDocument; // from /ext/dom  
                  $xml->loadXML($examplexml);  
                    
                  $xsl = new DomDocument;  
                  $xsl->loadXML($examplexsl);  
                    
                  /* Configure the transformer */  
                  $proc = new xsltprocessor;  
                  $proc->importStyleSheet($xsl); // attach the xsl rules  
                  echo $proc->transformToXML($xml); // actual transformation  
                  ?>  
                  
                  

                  Dank und Gruß,

                  frankx

                  1. Hallo Frankx,

                    das mit dem xml, xsl und php klappt eigentlich. Bei mir ist nur das CSS das Problem.

                    Als ich von Dir das Beispiel angeschaut habe, dann arbeitest Du hier mit h1 etc.

                    <xsl:template match="inner">
                    <h1><xsl:value-of select="element1"/></h1>
                    <h2>by <xsl:value-of select="element2"/></h2>
                    </xsl:template>
                    </xsl:stylesheet>

                    Dies ist aber genau die Sache die ich vormals entfernt habe und mit CSS ersetzen wollte.

                    Anbei der spezfische Ausschnitt aus meinem Tag:

                    <head>
                            <title>
                              <xsl:value-of select="title"/>
                            </title>
                            <style type="text/css">
                            .ueberschrift { font-family:Verdana; font-style:normal; font-weight: bolder; }
                            .parameter { font-family:Verdana; font-style:normal; font-size:70%; }
                            .haupttext { font-family:Verdana; font-style:normal; font-size:100%; }
                            </style>
                          </head>

                    <body>
                          <p><span class="ueberschrift">
                              <xsl:value-of select="title "/>
                            </span>
                            </p>

                    etc.

                    Genau das ist das Problem.

                    Hilfe?

                    Gruß

                    Jo

                    1. Hellihello Jo,

                      es ist ja erstmal egal was bzw. ob das da in Deinem XSL-Template steht.  Frag ist, ob das

                        
                               <style type="text/css">  
                               .ueberschrift { font-weight: bold; }  
                               </style>  
                      
                      

                      am Ende bei rauskommt im Quelltext. Dem XSL-Template ist es im Grunde  erstmal egal, ob Du da CSS-Code in das Textdokument schreibst oder Javascript oder sonstiges HTML.

                      Übrigens ist die font-weight mE. bold nicht bolder.

                      Dank und Gruß,

                      frankx

                      1. Hi,

                        Übrigens ist die font-weight mE. bold nicht bolder.

                        'font-weight'
                            Value:   normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit

                        bolder ist durchaus zulässig (wie weit es von den Browsern unterstützt wird, ist eine andere Frage ...

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        O o ostern ...
                        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      2. Hello,

        Die XML-Datei:

        ...macht wenig Sinn. Weder ist sie korrekt verschachtelt (vgl. </xyz> vs. <Element>, <Schema>) noch passt sie dementsprechend zum XSL (worauf soll "xyz" matchen, wenn es kein derartiges Element gibt) - Validiere zunächst dein Dokument, dann kann es weiter gehen.

        MfG
        Rouven

        --
        -------------------
        Death is nature's way of telling you to slow down.
        1. Hello,

          Die XML-Datei:
          ...macht wenig Sinn. Weder ist sie korrekt verschachtelt (vgl. </xyz> vs. <Element>, <Schema>) noch passt sie dementsprechend zum XSL (worauf soll "xyz" matchen, wenn es kein derartiges Element gibt) - Validiere zunächst dein Dokument, dann kann es weiter gehen.

          ...das ist aber schlecht, die XML Dateien bekomme ich per FTP Push zur Verfügung gestellt; da kann ich nichts ändern ?!?

          MfG
          Rouven

      3. Hi,

        Die XML-Datei:

        Daß das kaputt ist, wurde Dir ja schon gesagt.

        Das Parsen mit einer XSL-Datei:

        <xsl:template match="xyz">

        Da es kein Element xyz gibt, wird dieses template niemals matchen.
        (ok, solange das XML kaputt ist, wird es niemals bis zur Transformation kommen)

        <html>
              <head>

        [...]

        </body>
            </html>
          </xsl:template>

        Wenn es zur Anwendung käme, würde es ein fast vollständiges HTML-Dokument erzeugen.

        Die Ausgabe mittels einer PHP-Datei (nur dieser Ausschnitt ist auch dargestellt):

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
        <Html>
        <HEAD>

        Die zweite und dritte Zeile passen nicht zur ersten Zeile (in XHTML werden Elementnamen kleingeschrieben).
        Hier beginnst Du also ein (X)HTML-Dokument.

        <?php
        $xsltproc = xslt_create();
        $html1 = xslt_process($xsltproc, 'news.xml', 'news.xsl');
        $html2 = xslt_process($xsltproc, 'news2.xml', 'news2.xsl');
        if (!$html1) die('XSLT processing error: '.xslt_error($xsltproc));
        xslt_free($xsltproc);
        echo html_entity_decode($html1,ENT_QUOTES);

        Wenn Dein Template für das xyz-Element benutzt würde, würdest Du hier mitten in Deinem XHTML-Dokument ein fast vollständiges HTML-Dokument unterbringen, Du hättest also ein html-Element mitten im html-Element, außerdem natürlich Inkonsistenzen wegen HTML-Elementen im XHTML-Dokument (<img ...> statt <img ... /> usw.).

        Damit wäre nun der Zusammenhang hergestellt mit dem Problem, dass die Website Frontend PHP-Datei die XML-Dokumente unformatiert darstellt.

        Ich hab keine Erfahrung mit xslt_process, aber vielleicht liefert das im Fehlerfall (nicht-xml als Eingabe) einfach das Quell-(Nicht-)XML zurück?

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.