julia: XSL-Transformation klappt offensichtlich nicht!

Hallo,

ich möchte aus meinem XML-Dokument ein formatiertes Dokument machen (wer hätte das gedacht). Ich habe zuerst die XML-Datei geschrieben:

<?xml version="1.0" encoding="UTF-8" ?>  
<?xml-stylesheet type="text/xsl" href="stylebrief.xsl" ?>  
  
<dokument>  
  
	<brief autor="Julia"  
		abteilung="Lager"  
		erstellungsdatum="2008-03-31">  
  
		<ueberschrift> Ueberschrift </ueberschrift>	  
	  
		<textkoerper>  
			<u1>ueb1</u1>  
			<absatz>absatz</absatz>  
		</textkoerper>  
			  
	</brief>  
  
</dokument>

danach die XSD-Datei:

<?xml version="1.0" encoding="UTF-8" ?>  
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  
	  
	<xs:complexType name="abteilungType" >  
		<xs:choice>  
			<xs:element name="Vertrieb" type="xs:string" />  
			<xs:element name="Buchhaltung" type="xs:string" />  
			<xs:element name="Lager" type="xs:string" />  
			<xs:element name="Betriebsfuehrung" type="xs:string" />  
		</xs:choice>  
	</xs:complexType>  
  
	<xs:complexType name="textkoerperType" >  
		<xs:sequence>  
			<xs:element name="ueberschrift1" type="xs:string" minOccurs="0" maxOccurs="1" />  
			<xs:element name="absatz" type="xs:string" minOccurs="1" maxOccurs="unbounded" />  
		</xs:sequence>  
	</xs:complexType>  
	  
	<xs:complexType name="dokumentType">  
		<xs:sequence>  
			<xs:element name="brief" type="briefType" maxOccurs="unbounded" />  
		</xs:sequence>  
	</xs:complexType>  
	  
	<xs:complexType name="briefType">  
		<xs:sequence>  
			<xs:element name="ueberschrift" type="xs:string" />  
			<xs:element name="textkoerper" type="textkoerperType" />  
		</xs:sequence>  
			<xs:attribute name="autor" type="xs:string" use="required" />  
			<xs:attribute name="erstellungsdatum" type="xs:date" use="optional" />  
			<xs:attribute name="abteilung" type="abteilungType" use="required" />  
	</xs:complexType>  
	  
	<xs:element name="dokument" type="dokumentType" />  
	  
</xs:schema>

und zum Schluss die XSL-Datei:

<?xml version="1.0" encoding="UTF-8" ?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/Transform" >  
  
<xsl:template match="/" >  
<html>  
<head>  
	<title>Dokumente:</title>  
</head>  
<body>  
	<xsl:apply-templates select="dokument/brief"/>  
</body>  
</html>  
</xsl:template>  
<xsl:template match="brief">  
	<p>  
		<xsl:value-of select="ueberschrift" /><br />  
		<xsl:value-of select="textkoerper" /><br />  
		<xsl:value-of select="u1" /><br />  
		<xsl:value-of select="absatz" /><br />  
		Erstellungsdatum:<xsl:value-of select="@erstellungsdatum" />  
	</p>  
</xsl:template>  
</xsl:stylesheet>

Nun hab ich das Problem, dass der IE7 das hier anzeigt: Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet XSL verwendet wird.

und Firefox gibt mir den Text unformatiert aus. Das sieht so aus: Ueberschrift ueb1 absatz

Ich denke da müssten doch mindestens die <br>s zu sehen sein... und der title auch oO

danke schonmal für eure hilfe ;)

  1. Hallo,

    [code lang=xml]<?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/Transform" >

    Korrekt ist:  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" !
                                                   ^^^^

    Grüße
    Thomas

    1. Oh danke :D ... funktioniert immernoch nicht... ich hab die Cookies gelöscht und die Datei gespeichert, aber immernoch das Selbe :O

      1. Hallo,

        Oh danke :D ... funktioniert immernoch nicht... ich hab die Cookies gelöscht und die Datei gespeichert, aber immernoch das Selbe :O

        Das kann ich nicht nachvollziehen.
        FireFox prodiziert folgendes:

        <html><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><title>Dokumente:</title></head><body><p> Ueberschrift <br>  
                                ueb1  
                                absatz  
                        <br><br><br>  
                        Erstellungsdatum:2008-03-31</p></body></html>
        

        Das ist genau das, was dein XSLT machen soll.

          
        <xsl:template match="brief">  
                <p>  
                        <xsl:value-of select="ueberschrift" /><br />  
                        <xsl:value-of select="textkoerper" /><br />  
                        <xsl:value-of select="u1" /><br />  
                        <xsl:value-of select="absatz" /><br />  
                        Erstellungsdatum:<xsl:value-of select="@erstellungsdatum" />  
                </p>  
        </xsl:template>  
        
        

        In deinem XML gibt es aber keinen "brief/u1" oder "brief/absatz" sondern "textkoerper/u1" und "textkoerper/absatz" was du ja nicht ausgibts.
        <xsl:value-of select="textkoerper" /> macht auch was es soll: gibt den Textinhalt von <textkoerper> aus und das ist  "ueb1 [zeilenumbruch] absatz".

        Grüße
        Thomas

        1. Das kann ich nicht nachvollziehen.
          FireFox prodiziert folgendes:

          <html><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><title>Dokumente:</title></head><body><p> Ueberschrift <br>

          ueb1
                                  absatz
                          <br><br><br>
                          Erstellungsdatum:2008-03-31</p></body></html>

          
          >   
          > Das ist genau das, was dein XSLT machen soll.  
          >   
            
          Das müsste dann aber auch als Quelltext im Browser angezeigt werden, oder nicht? Weil das tut es nicht, wenn ich mir den Quelltext ansehe, steht da der Code von der XML-Datei  
            
          
          > ~~~xml
            
          
          > <xsl:template match="brief">  
          >         <p>  
          >                 <xsl:value-of select="ueberschrift" /><br />  
          >                 <xsl:value-of select="textkoerper" /><br />  
          >                 <xsl:value-of select="u1" /><br />  
          >                 <xsl:value-of select="absatz" /><br />  
          >                 Erstellungsdatum:<xsl:value-of select="@erstellungsdatum" />  
          >         </p>  
          > </xsl:template>  
          > 
          
          

          In deinem XML gibt es aber keinen "brief/u1" oder "brief/absatz" sondern "textkoerper/u1" und "textkoerper/absatz" was du ja nicht ausgibts.

          Ja ich denk das hab ich verstanden, weiß aber nicht worauf du hinaus willst... muss ich "textkoerper/u1" und "textkoerper/absatz" extra dahin schreiben?

          <xsl:value-of select="textkoerper" /> macht auch was es soll: gibt den Textinhalt von <textkoerper> aus und das ist  "ueb1 [zeilenumbruch] absatz".

          Wenn ich textkoerper ausgeben lasse, brauch ich dann u1 und absatz nicht extra ausgeben lassen?

          1. Hallo,

            »» Das ist genau das, was dein XSLT machen soll.
            »»

            Das müsste dann aber auch als Quelltext im Browser angezeigt werden, oder nicht? Weil das tut es nicht, wenn ich mir den Quelltext ansehe, steht da der Code von der XML-Datei

            Das ist völlig normal. Die eigentliche quell ist das XML. Das HTML ist nur das Ergebnis der Transformation. Mache im FF STRG+A dann Rechtsklick und im Kontextmenü dann "Auswahl-Quelltext anzeigen" dann bekommst du das HTML zu sehen.

            »» ~~~xml

            »» <xsl:template match="brief">
            »»         <p>
            »»                 <xsl:value-of select="ueberschrift" /><br />
            »»                 <xsl:value-of select="textkoerper" /><br />
            »»                 <xsl:value-of select="u1" /><br />
            »»                 <xsl:value-of select="absatz" /><br />
            »»                 Erstellungsdatum:<xsl:value-of select="@erstellungsdatum" />
            »»         </p>
            »» </xsl:template>
            »»

            
            > »»  
            > »» In deinem XML gibt es aber keinen "brief/u1" oder "brief/absatz" sondern "textkoerper/u1" und "textkoerper/absatz" was du ja nicht ausgibts.  
            >   
            > Ja ich denk das hab ich verstanden, weiß aber nicht worauf du hinaus willst... muss ich "textkoerper/u1" und "textkoerper/absatz" extra dahin schreiben?  
              
            Das kommt darauf an was du und wie du es ausgeben willst.  
            Wenn du nach u1 und nach absat ein <br> ausgeben willst dann muss du an der stelle <xsl:value-of select="textkoerper/u1" /><br /> und  
            <xsl:value-of select="textkoerper/absatz" /><br /> schreiben.  
              
            Du bist nämlich im Template für <brief>, daher muss du zu dem Elementen "navigieren" die du ausgeben willst.  
              
              
            
            > »» <xsl:value-of select="textkoerper" /> macht auch was es soll: gibt den Textinhalt von <textkoerper> aus und das ist  "ueb1 [zeilenumbruch] absatz".  
            >   
            > Wenn ich textkoerper ausgeben lasse, brauch ich dann u1 und absatz nicht extra ausgeben lassen?  
              
            Nein. Vereinfacht: "value-of" gibt dir den reinen Textinhalt eines Elements aus, inkl. den Textinhalt dessen Kind- und Kindeskindelemente.  
            <xsl:value-of select="textkoerper" /> liefert dir also nur den reinen Textinhalt, die in dem Fall genau gesagt aus einem Zeilenumbruch, Leerzeichen, aus "ub1", einem Zeilenumbruch, Leerzeichen und schießlich aus "absatz" besteht.  
            Da kannst du auch nichts mehr formatieren mit <br> oder so. Das sind dann aus sich des XSL-Prozessors dann nur iterale Zeichen, die er genau so in dem Ergebnis der Transformation schreib.  
              
            Grüße  
            Thomas