szsoftware: html-Tags verschwinden

Hallo,
ich steh total auf dem Schlauch.
Ich habe folgende .xml:

XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="protokoll.xsl"?>

<protokoll>
 <datum>04.10.2006</datum>
 <author>
  <name>Räuber Hotzenplotz</name>
  <gender>male</gender>
 </author>

<anwesende>
  <name>Hans</name>
  <name>Liesel</name>
  <name>Eberhardt</name>
  <name>Peter</name>
  <name>Oma</name>
  <name>Wolf</name>
 </anwesende>

<toc>
  <top id="1" order="1">
   <title>Das erste Topic</title>
  </top>
  <top id="2" order="2">
   <title>Sprechstunden-Angebot der Fakultät</title>
   <subtitle>in der Vorlesungsfreien Zeit</subtitle>
   <author>
    <name>Frau Holle</name>
    <comment>in Abwesenheit</comment>
   </author>
  </top>
  <top id="3" order="3">
   <title>Blanko-Scheine</title>
   <author>
    <name>Gretel</name>
    <comment>telefonisch</comment>
   </author>
  </top>
 </toc>

<data>
  <top id="1">
   Erstes Topic wird hier genauer beschrieben.
   Genauer werden die hier enthaltenen html-Elemente vom xslt-Transformer (xalan) "geschluckt".
   <br />

<ol>
    <li>Einkaufen:<br />
     <ul>
      <li>Ben kauft ein</li>
      <li>Ben kontaktiert Aron</li>
      <li>Aron soll Geld vorstrecken</li>
     </ul>
    </li>
    <li>Themen: (unsortiert)<br/>
     <ul>
      <li>neue Studiengänge (Tobi)</li>
      <li>Studiengebühren an der RUB (Benni)</li>
      <li>Mitwirkung im FSR (Thesi)</li>
      <li>Zulassung zum Master (Tobi)</li>
      <li>Wahl der neuen Mitglieder</li>
      <li>Kassenbericht (Aron)</li>
     </ul>
    </li>
    <li>Moderation. wahrscheinlich Martin</li>
    <li>Plakat:<br />
     <ul>
      <li>Entwurf: Martin</li>
      <li>Druckerei: Martin</li>
      <li>Auflage: 30 Stk.</li>
      <li>Aufhängen: Martin schreibt Mail nach Fertigstellung, spätestens bis 10. Oktober<br />
       Aufgehangen werden soll ab 16. Oktober (<span style="color:red">Achtung, abhängig von evtl. VV-Verlegung!</span>)
      </li>
     </ul>
    </li>
   </ol>
  </top>

<top id="2">
   Hier stehen die Daten für das zweite Topic.
  </top>

<top id="3">
   Und hier für das dritte.
  </top>
 </data>
</protokoll>

###########################################################

Diese .xsl formatiert das ganze:

XSL

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:html="http://www.w3.org/1999/xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="html">

<xsl:output method="xml" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<xsl:template match="/">
<html>
  <head>
   <title>FSR-Protokoll vom <xsl:value-of select="/protokoll/datum" /></title>
  </head>
  <body>
 <xsl:apply-templates />
  </body>
  </html>
</xsl:template>

<xsl:template match="datum">
 <h2>FSR-Protokoll vom <xsl:value-of select="." /></h2>
</xsl:template>

<xsl:template match="anwesende">
 <table border="0">
 <xsl:for-each select="name">
 <tr>
  <td><xsl:if test="position() = 1">Anwesend:</xsl:if></td>
  <td><xsl:value-of select="position()" />.</td>
  <td><xsl:value-of select="." /></td>
 </tr>
 </xsl:for-each>
 </table>
</xsl:template>

<xsl:template match="/protokoll/author">
 <div><b><u>Protokollführung:</u></b>&#160;<xsl:value-of select="name" /></div><br />
</xsl:template>

<xsl:template match="toc">
 <h3>Themen:</h3>

<xsl:for-each select="top">
  <xsl:sort select="@order" />
  <div>Top <xsl:value-of select="position()" /> - <xsl:value-of select="title" /></div>
 </xsl:for-each>
</xsl:template>

<xsl:template match="data">
 <hr noshade="noshade" />

<xsl:for-each select="/protokoll/toc/top">
  <xsl:sort select="@order" />
  <xsl:variable name="id" select="@id" />
  <h2>Top <xsl:value-of select="position()" /> - <xsl:value-of select="title" /></h2>
   <xsl:if test="subtitle"><h3><xsl:value-of select="subtitle" /></h3></xsl:if>
  <div>
   <xsl:if test="author/name">
    <h4>Eingereicht von: <xsl:value-of select="author/name" />
    <xsl:if test="author/comment">
     (<xsl:value-of select="author/comment" />)
    </xsl:if>
    </h4>
   </xsl:if>
   <xsl:value-of select="/protokoll/data/top[@id=$id]"/>
  </div>
 </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

##################################################################

Jetzt das Problem: Alle html-Tags in (xpath) /protokoll/data/top (letztes Template [match="data"]) werden nicht in die xhtml-Datei transformiert.

Was mache ich falsch?

Gruß,
sz

  1. Das Problem habe ich soeben gelöst.
    Der fragliche Abschnitt in der .xml wird jetzt in einer CDATA-Sektion aufgeführt.

    In die .xsl muss im entsprechenden xsl:value-of noch das Attribut disable-output-escaping="yes" gesetzt werden, damit die Spitzklammern, das bewirken, was sie sollen.

    Die Änderungen im Code:

    XML

    [...]
    <data>
      <top id="1">
      <![CDATA[

    Erstes Topic wird hier genauer beschrieben.

    Genauer werden die hier enthaltenen html-Elemente vom xslt-Transformer (xalan) "geschluckt".
       <br />
       Hier können jetzt <ul> und <ol> und andere HTML-Tags gesetzt werden. Natürlich würde das so, wie es jetzt ist, eine falsche Struktur erzeugen, also bitteschön die Element-Hierarchie befolgen:

    <ul>
            <li>Dann klappta auch mit dem Nachbarn(-Element)</li>
         </ul>

    ]]>

    </top>
    </data>
    [...]

    ###########################################################

    Diese .xsl formatiert das ganze:

    XSL

    [...]

    <xsl:template match="data">
    <hr noshade="noshade" />

    <xsl:for-each select="/protokoll/toc/top">
      <xsl:sort select="@order" />
      <xsl:variable name="id" select="@id" />
      <h2>Top <xsl:value-of select="position()" /> - <xsl:value-of select="title" /></h2>
       <xsl:if test="subtitle"><h3><xsl:value-of select="subtitle" /></h3></xsl:if>
      <div>
       <xsl:if test="author/name">
        <h4>Eingereicht von: <xsl:value-of select="author/name" />
        <xsl:if test="author/comment">
         (<xsl:value-of select="author/comment" />)
        </xsl:if>
        </h4>
       </xsl:if>
       <xsl:value-of select="/protokoll/data/top[@id=$id]" disable-output-escaping="yes"/>
      </div>
    </xsl:for-each>
    </xsl:template>

    [...]

    ##################################################################

  2. Moin!

    Ohne es genauer analysiert zu haben: Du verwendest stets xsl:value-of. Das gibt aber keine Tags asu. Entweder Du versiehst den Source mit <![CDATA[ ]]> und baust im xsl:value-of ein disable-output-escaping="yes" ein, oder Du nimmst xsl:copy-of.

    -- Skeeve

    1. Moin!

      Ohne es genauer analysiert zu haben: Du verwendest stets xsl:value-of. Das gibt aber keine Tags asu. Entweder Du versiehst den Source mit <![CDATA[ ]]> und baust im xsl:value-of ein disable-output-escaping="yes" ein, oder Du nimmst xsl:copy-of.

      -- Skeeve

      :-). Da war ich eine Minute schneller. Schön, dass ich doch noch von alleine drauf gekommen bin.
      Aber dass hier so schnell eine kompetente Antwort erscheint...

      Danke Dir auch für die andere Lösung.
      Die erscheint mir fast noch etwas eleganter...

      Gruß Sven

  3. Hallo,

    <xsl:template match="data">
    <hr noshade="noshade" />

    <xsl:for-each select="/protokoll/toc/top">
      <xsl:sort select="@order" />
      <xsl:variable name="id" select="@id" />
      <h2>Top <xsl:value-of select="position()" /> - <xsl:value-of select="title" /></h2>
       <xsl:if test="subtitle"><h3><xsl:value-of select="subtitle" /></h3></xsl:if>
      <div>
       <xsl:if test="author/name">
        <h4>Eingereicht von: <xsl:value-of select="author/name" />
        <xsl:if test="author/comment">
         (<xsl:value-of select="author/comment" />)
        </xsl:if>
        </h4>
       </xsl:if>
       <xsl:value-of select="/protokoll/data/top[@id=$id]"/>
      </div>
    </xsl:for-each>
    </xsl:template>

    </xsl:stylesheet>

    ##################################################################

    Jetzt das Problem: Alle html-Tags in (xpath) /protokoll/data/top (letztes Template [match="data"]) werden nicht in die xhtml-Datei transformiert.

    Was mache ich falsch?

    1. Wie gesagt du wählst den Weg mit value-of, das nur Text ausgibt.
    2. Deine Lösung mit  <![CDATA[ ]]> ist alles andere als befriedigend, du ruinierst damit das XML und vor allem du wirst somit nie zugriff auf die (HTML-) Elemente bekommen, falls sich das als nötig erweist.

    Lösung: statt value-of wählst du:
    <xsl:copy-of select="/protokoll/data/top[@id=$id]/child:node()"/>

    Grüße
    Thomas