Announcement

Collapse
No announcement yet.

warum unterdrückt XSLT ein html-Tag ?

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

  • warum unterdrückt XSLT ein html-Tag ?

    Hallo allerseits,

    Die test.xsl-Datei
    <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xslutput method="html"/>
    <xsl:template match="eintrag">
    <tr><xsl:apply-templates/></tr>
    </xsl:template>
    </xsl:stylesheet>


    Die test.xml-Datei
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="test.xsl" ?>
    <eintrag>
    <td>dok1.ppt<br></br>dok2.ppt<br></br></td><td>dok3.ppt<br></br></td>
    </eintrag>

    Warum ergibt die Umwandlung in eine html-Datei die folgende
    test.html Datei ?
    <tr>
    dok1.pptdok2.pptdok3.ppt
    </tr>

    Warum fehlt <td> und <br>
    Warum nicht:
    <tr>
    <td>dok1.ppt<br></br>dok2.ppt<br></br></td><td>dok3.ppt<br></br></td>
    </tr>

    mfg
    carlox

  • #2
    Wenn du Elemente kopieren willst, dann musst du dafür ein Template schreiben:
    Code:
    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="eintrag">
      <tr><xsl:apply-templates/></tr>
    </xsl:template>
    Die eingebauten Templates machen fuer Elemente nur folgendes:
    Code:
    <xsl:template match="*">
      <xsl:apply-templates/>
    </xsl:template>
    so du anderes oder mehr erreichen willst, in deinem Fall also das Kopieren von Elementen, musst du dafür Code schreiben. Mein Beispiel mit 'match="*"' mag allerdings zu allgemein sein, je nach Kontext kannst du das aber in z.b. 'match="td | br"' ändern.

    Comment


    • #3
      Originally posted by Martin Honnen View Post
      Wenn du Elemente kopieren willst, dann musst du dafür ein Template schreiben:
      ...
      ok, aber ich habe noch ein weiteres Problem, wenn ich html-Tags wie z.B. <br></br>
      in eine xsl-Datei schreibe. Siehe einfaches konkretes Beispiel unten:

      Die test.xls Datei
      ----------------
      <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
      <xslutput method="html"/>
      <xsl:template match="tabelle">
      <table>
      <caption align="top"><xsl:apply-templates select="ueberschrift"/></caption>
      <xsl:apply-templates select="eintrag"/>
      <br></br> <----- Das ist das Problem
      </table>
      </xsl:template>

      <xsl:template match="eintrag">
      <tr><xsl:apply-templates/></tr>
      </xsl:template>

      <xsl:template match="kopf">
      <th>
      <h1><xsl:apply-templates/></h1>
      </th>
      </xsl:template>

      </xsl:stylesheet>

      Die test.xml Datei:
      -----------------
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <?xml-stylesheet type="text/xsl" href="test.xsl" ?>
      <tabelle>
      <eintrag>
      <kopf>Gebiet1</kopf>
      <kopf>Gebiet2</kopf>
      <kopf>Gebiet3</kopf>
      <kopf>Gebiet4</kopf>
      </eintrag>
      <eintrag>
      <kopf>Gebiet11</kopf>
      <kopf>Gebiet21</kopf>
      <kopf>Gebiet31</kopf>
      <kopf>Gebiet41</kopf>
      </eintrag>
      </tabelle>

      Die test.html Datei:
      ------------------
      <table>
      <caption align="top"></caption>
      <tr>

      <th>
      <h1>Gebiet1</h1>
      </th>
      <th>
      <h1>Gebiet2</h1>
      </th>
      <th>
      <h1>Gebiet3</h1>
      </th>
      <th>
      <h1>Gebiet4</h1>
      </th>

      </tr>
      <tr>

      <th>
      <h1>Gebiet11</h1>
      </th>
      <th>
      <h1>Gebiet21</h1>
      </th>
      <th>
      <h1>Gebiet31</h1>
      </th>
      <th>
      <h1>Gebiet41</h1>
      </th>

      </tr>
      <br>
      </table>

      Das Problem:
      ------------
      warum wird der Text <br></br> in der xsl-Datei nicht genauso auch in die test.html Datei geschrieben (sondern nur <br> )?
      Das ist mir absolut unklar. Denn schreibe ich statt <br></br> z,B, den Text <brd></brd>
      funktioniert alles einwandfrei.
      Liegt das daran, dass <br> ein html-Tag ist??
      Dann müsste es aber auch z.B. mit <td></td> Probleme geben, oder ???

      mfg
      Ernst

      Comment


      • #4
        html kennt kein abschließendes br
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          html kennt kein abschließendes br
          Das stimmt.
          Aber was ist, wenn ich das trotzdem verwende.
          Ich will einfach, dass <br></br> in die html-Datei geschrieben wird.
          Ob damit der Browser etwas anfangen kann, ist mir erst mal egal.

          mfg
          Ernst

          Comment


          • #6
            Weiss ich nicht, aber vielleicht erzeugst du mal eine xhtml-Datei. Dort ist das abschließenede br erlaubt
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              Weiss ich nicht, aber vielleicht erzeugst du mal eine xhtml-Datei. Dort ist das abschließenede br erlaubt
              1)
              Behauptung:
              Wenn man will, dass eine xsl-Datei genau den Tag <br> in eine html-Datei schreibt, dann muss
              man in die xsl-Datei <br></br> schreiben.
              Ist das richtig ?

              2)
              Gibt es noch weitere Tags, die nicht 1:1 in die html-Datei geschrieben werden ?

              mfg
              carlox

              Comment


              • #8
                XSLT ist keine Programmiersprache, um eine Textausgabe 1:1 zu erzeugen. Wenn du in deinem XSLT-Code ein Resultatselement in XML-Syntax schreibst, dann hast du alle Möglichkeiten, die XML erlaubt, du kannst also ein leeres "br"-Element als
                Code:
                <br/>
                oder auch als
                Code:
                <br></br>
                oder auch als
                Code:
                <br />
                im XSLT-Code schreiben. Damit wird im Resultatsbaum aber einfache ein Elementknoten mit Namen "br" und keinem Inhalt (also keinen Kindknoten) erzeugt. Wie dieser Knoten dann serialisiert wird, hängt unter anderem von der Ausgabemethode ab, die per xsl: output method festgelegt wird; wenn die Ausgabemethode "xml" ist, dann wird der Knoten in XML-Syntax serialisiert, dabei hat der XSLT-Prozessor bzw. sein Serialisierer aber wieder alle drei oben genannten Möglichkeiten, und diese unabhängig davon, was genau im Quellcode deines XSLT-Stylesheets steht. Wenn die Ausgabemethode "html" ist, dann wird HTML-Syntax verwendet, die erlaubt dann genau nur
                Code:
                <br>
                für ein leeres "br"-Element. Mit XSLT 2.0 gibt es noch "xhtml" als Ausgabemethode, die es erlauben soll, sowohl der X(HT)ML-Syntax gerecht zu werden, als auch das Dokument als Content-Type "text/html" an die "tag soup"-Parser der gängigen Browser bzw. heute an die HTML5-Parser der Browser auslieferen zu können, da bleibt dann nur
                Code:
                <br />
                als Serialisierung.
                Dann gibt es noch die Ausgabemethode "text", da wird nur der Inhalt von Textknoten serialisiert, ein leeres "br"-Element wird dabei gar nicht zur Ausgabe beitragen.

                Comment


                • #9
                  Nicht, dass ich das in diesem Fall sinnvoll finde, aber als Ergänzung:
                  [highlight=xml]<xsl:text disable-output-escaping="yes">&lt;br>&lt;/br></xsl:text>[/highlight]

                  Comment

                  Working...
                  X