Announcement

Collapse
No announcement yet.

Entity Problem bei HTML Transformatin Mit XSLT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Entity Problem bei HTML Transformatin Mit XSLT

    Liebe Leute,
    ich habe schon viel Hilfe in eurem Forum gefunden. Heute werde ich aber nicht fündig und wende mich direkt an Euch. Folgendes:
    Ich habe ein HTML-File. Welches ich aus einer XML-File mittels XSLT generiert habe.
    Nun möchte mit einer zweiten XSLT das HTML-File erneut Transformieren. Doch hier tritt ein Fehler auf: "The entity "uuml" was referenced, but not declared."
    Ich Benutze Oxygen als Editor und als XSLT Prozessor verwende ich Saxon.

    Mein Code Sieht wie folgt aus:

    HTML:
    Code:
    <html xmlns:html="http://www.w3.org/1999/xhtml">
       <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
       
          <title>Katalog</title>
       </head>
       <body>
          <div id="2">
             <h1>Blabla</h1>
             <h2>BlaBla </h2>
             <p>BlaBla f&uuml;r Bla f&uuml;r Bla </p>
             
        </div>
     [...]
    </body>
    </html>
          </div>
    XSLT:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:html="http://www.w3.org/1999/xhtml"
        version="2.0" exclude-result-prefixes="#all">
        
      
      <xsl:output method="html"/>
        <xsl:template match="div">
        
        <xsl:result-document method="html" href='html/{@id}.html'>
            <xsl:copy-of select="."/>
         </xsl:result-document>   
            
        </xsl:template>
    </xsl:stylesheet>
    Wo müssen denn die Entities Beschrieben werden? Mein Fehler ist bestimmt was Grundlegendes, was mir Fehlt. Ich kommt mit einer Googel-Suche im Moment auch nicht weiter. Daher Bitte ich um Hilfe. Eventuell mach ich schon einen Fehler in meiner erste XML-HTML Transformation?!

    Ich Bedanke mich vielmals für eure Mühe.

  • #2
    Erzeuge im ersten Schritt gültiges XHTML mit handelsüblichem DOCTYPE (dann werden die Entity-Referenzen im HTML aufgelöst). Das vorliegende Eingabedokument ist ja kein XML (meta nicht geschlossen, seltsames div nach dem Wurzelelement), so also nicht transformierbar. Warum werden die Umlaute nicht direkt verwendet?

    Für die Transformation selbst können die Zeichenreferenzen im Stylesheet angebenen werden:

    [highlight=xml]<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [
    <!ENTITY uuml "&#xFC;">
    ]>
    <xsl:stylesheet ...>

    </xsl:stylesheet>[/highlight]

    Comment


    • #3
      Thomas, Vielen Dank für deine Mühe.
      Jetzt ist mir wenigstens klar wo der Schuh drückt. Bei meiner ersten Transformation mach ich bereits einen Fehler. Ich hatte als <xslutput method="html"> angegeben. Das hat mir, glaube ich auch, den Meta Tag generiert der nicht geschlossen ist. Warum er nicht geschlossen ist, ist mir ein Rätsel. Auch weis ich nicht wie ich das behebe.
      Da ich gerade in den XSL Referenzen gesehen habe das es ab Version 2.0 auch XHTML als "Output Method" gibt, verwende ich nun diese. Da ist der Meta Tag dann auch nicht mehr dabei und <?xml version="1.0" encoding="UTF-8"?> ist dabei.
      Dennoch ist meine HTML Datei laut Oxygen nicht Valide.

      Hier der Wesentliche Auszug aus meiner XML->XHTML Transformation
      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns:html="http://www.w3.org/1999/xhtml"
                      
          version="2.0">
          <xsl:output method="xhtml" encoding="UTF-8"/>
          
          <xsl:template match="/">
              
              <html>
                  <head><title>Bla</title></head>
                  <body>
                   
                      <xsl:call-template name="weiter"/>
                      
                  </body>
                </html>
              
          </xsl:template
      
         ...
      Jetzt habe ich 3 Fragen, damit ich das ganze verstehen kann.

      1. Was mach ich Falsch das kein Valides XHTML rauskommt. Im Gezeigten Code hab ich doch was grundlegendes nicht Verstanden?!
      2. Warum werden die Umlaute nicht direkt verwendet? Das frage ich mich auch. Nach der xml -> xhtml Transformation werden aus den Umlauten Entitys, obwohl ich UTF-8 angegeben habe. Hat das nichts mit der Codierung zu tun?
      3. Was ist am Div-Container komisch. Verstößt er gegen irgendwelche Regeln? Oder ist eine ID lediglich unüblich?

      Vielen Dank

      Comment


      • #4
        Versuche es so:

        [highlight=xml]<xslutput method="xhtml" version="1.0" encoding="UTF-8" indent="yes"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>[/highlight]

        Falls die XML-Deklaration in der Ausgabe wegfallen soll, zusätzlich mit omit-xml-declaration="yes".

        Beim div-Elements stört vermutlich die id="2". XML-IDs beginnen mit einem Buchstaben. Hilfreich ist ab XSLT 2.0 noch xpath-default-namespace="http://www.w3.org/1999/xhtml" beim xsl:stylesheet-Element, dann bedarf es xmlns:html="..." nicht.

        Comment


        • #5
          Vielen Dank Thomas! Mit deiner Hilfe habe ich jetzt ein Saubere XHTML Dokument. Ich hänge jetzt zwar am nächsten Punkt, aber dieser wäre erstmal geklärt. Für diejeigen die eventuell ein ähnliches Problem haben will ich hier dokumetieren wie meine XSLT transformation ausschaut, damit gescheites XHTML rauskommt:

          Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="2.0" 
                          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
              
              <xsl:output method="xhtml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"
                  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
                  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"  
                  xpath-default-namespace="http://www.w3.org/1999/xhtml"
              />
              
              <xsl:template match="/">
          ...
          So habe ich auch kein Problem mehr mit den Umlauten.

          Bleibt dann noch die Problematik mit dem DIV. IDs dürfen in XHTML nur mit Buchstaben beginnen, wie Thomas bereits erwähnte. Ich habe das Ganze jetzt so gelöst, dass vor der eigentlichen IDEE einfach ein fester String(?) steht und danach erst die eigentliche Zahl kommt. Das habe ich mit folgendem CODE hinbekommen:

          Code:
          div>
                     <xsl:attribute name="id">
                         <xsl:variable name="newID" select="@Id"/>
                             
                         
                         <xsl:value-of select="concat('produkt',$newID)"/>
                     </xsl:attribute>
          Als Ergebnis habe ich jetzt "product" mit der einer eindeutigen Nummer dahinter. Es wäre nicht zwingend notwendig die ID in die Variable newID zu schreiben. Für mich ist das aber die einfacher Lösgung.

          Comment


          • #6
            xpath-default-namespace="http://www.w3.org/1999/xhtml" gehört aber sicher nicht als Attribut zu dem xsl: output-Element.

            Comment

            Working...
            X