Xhtml Dokument mit xslt-Script formatieren.

soa

Erfahrenes Mitglied
Hallo,

ich würde gern ein XHTML-Dokument mit einem XSLT-Template formatieren. Ich verwende zum Teil eigene Tags, die ich mit Hilfe von CSS nicht so gut anpassen kann. Mit XSLT habe ich mich noch nicht beschäftigt und versuche nun ein Testdokument zu formatieren.

Das Template habe ich über einen Link eingebunden:

PHP:
<link rel="Stylesheet" type="text/xml" media="all" href="artikel.xsl" />

Meine Tags sehen beispielsweise so aus:

PHP:
<Artikel>
    <Kategorie>Lorem ipsum</Kategorie>
    <Ueberschrift>Lorem ipsum dolor sit amet</Ueberschrift>
</Artikel>

Die Struktur selbst befindet sich innerhalb von normalen html-Tags wie : <div> </div>

Jetzt habe ich mit diesem Template versucht, meine Elemente zu verändern:

PHP:
<?xml version="1.0" encoding="ISO-8859-1"?>
 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">



 <xsl:template match="Artikel/Kategorie">
   <p>
   </p>
 </xsl:template>

 <xsl:template match="Titel">
   Titel: <span style="color:#ff0000">
   <xsl:value-of select="."/></span>
   <br />
 </xsl:template>

 <xsl:template match="Beschreibung">
   Beschreibung: <span style="color:#00ff00">
   <xsl:value-of select="."/></span>
   <br />
 </xsl:template>

 </xsl:stylesheet>

Leider habe ich es nicht geschafft, mein XHTML-Dokument anzupassen und HTML-Tags einzufügen.
Was mache ich falsch ? Kann ich überhaupt as diesem Wege ein XHTML-Dokument formatieren ?

Danke für die Rückmeldung.

Grüße
Jörn
 
Hi.

Dein Stylesheet ersetzt lediglich
XML:
<Kategorie>Lorem ipsum</Kategorie>
durch
XML:
<p/>

Wenn du möchtest, dass in einem Template für ein Element auch dessen Unterknoten durch Templates verarbeitet werden, dann mußt du explizit apply-templates spezifizieren:
XML:
<xsl:template match="Artikel/Kategorie"> 
   <p> 
     <xsl:apply-templates />
   </p> 
 </xsl:template>

Dann wird aus dem Beispiel
XML:
<p>Lorem ipsum</p>
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

danke für die Antwort. Das hat vom Verständnis her schon einmal sehr geholfen. Danke.

Hier funktioniert das auch mit reinem XML :

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_apply

Wenn ich aber mein XSLT-Script in einem XHTML-Dokument verwenden möchte, passiert einfach gar nichts.

PHP:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>Mein Artikel</h2>  
  <xsl:apply-templates/>  
  </body>
  </html>
</xsl:template>

<xsl:template match="Artikel">
  <p>
    <xsl:apply-templates select="Kategorie"/>  
    <xsl:apply-templates select="Ueberschrift"/>
  </p>
</xsl:template>

<xsl:template match="Kategorie">
  Kategorie: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

<xsl:template match="Ueberschrift">
  Ueberschrift: <span style="color:#00ff00">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

</xsl:stylesheet>

Meine XHTML-Seite habe ich mal in der Anlage gepostet. Geht XSLT nur für ein XML-Dokument ?
Wo liegt mein Fehler ?

Danke
 

Anhänge

  • xhtml.zip
    1 KB · Aufrufe: 15
Hi.

Das HTML link Element kannst du nicht für XSL Stylesheets verwenden, das ist für CSS Stylesheets gedacht.

Ein xsl Stylesheet bindest du über eine Processing-Instruction ein:
XML:
<?xml-stylesheet type="text/xsl" href="artikel.xsl"?>

Außerdem mußt du deinem Webserver noch beibringen den richtigen MIME Typ für .xhtml Dateien zu liefern (application/xhtml+xml), ansonsten wird dein Webbrowser das Dokument wahrscheinlich nicht als XML verarbeiten.

\edit: Das nächste Problem sind die Namensräume. Du spezifizierst in deinem XML Dokument, dass die Elemente im Standardnamensraum "http://www.w3.org/1999/xhtml" sind. Das gilt insbesondere auch für deine eigenen Elemente (Artikel, Kategorie usw).

Im Stylesheet wiederum hast du den Namensraum nicht spezifiziert. So stimmt der "Artikel" aus dem xhtml nicht mit dem "Artikel" aus dem xsl überein. Spezifiziere den gleichen Namensraum auch im Stylesheet:
XML:
<xsl:stylesheet version="1.0"
				xmlns="http://www.w3.org/1999/xhtml"
				xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Weiterhin spezifizierst du, das dein Dokument dem xhtml1 strict Dokumenttyp entspricht, was einfach nicht stimmt. Nimm das aus dem Quelldokument raus, verwende ein xsl:eek:utput Element und generiere das im Zieldokument.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

danke für die schnelle Rückmeldung. Ich habe jetzt folgendes durchgeführt:

1. ) Stylesheet Processing-Instruction wurde gesetzt.
2.) Documnet type habe ich aus dem XHTML entfernt.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3.) Anpassung des XSLT-Dokuments :

XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"  encoding="iso-8859-1" />
<xsl:template match="/">
  <html>
  <body>
  <h2>Mein Artikel</h2>  
  <xsl:apply-templates/>  
  </body>
  </html>
</xsl:template>

<xsl:template match="Artikel">
  <p>
    <xsl:apply-templates select="Kategorie"/>  
    <xsl:apply-templates select="Ueberschrift"/>
  </p>
</xsl:template>

<xsl:template match="Kategorie">
  Kategorie: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

<xsl:template match="Ueberschrift">
  Ueberschrift: <span style="color:#00ff00">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

</xsl:stylesheet>

Nun habe ich wohl eine Sache vergessen, da ich dachte, dass diese Information nicht so wichtig sei. Ich nutze keinen Webserver.
Ich möchte die Transformation lokal bzw. später über das Netzwerk durchführen.
Dementsprechend weiß ich nicht, wie ich dem Browser sagen soll, dass der richtige MIME Typ für .xhtml Dateien geliefert wird (application/xhtml+xml). Ich dachte, dass dies automatisch geschieht. Das XHTML wird ja korrekt im Browser angezeigt.

Derzeit wird allerdings noch keine Transformation durchgeführt.
Wo kann ich jetzt noch schauen ?

Danke
 
Zuletzt bearbeitet von einem Moderator:
Nun habe ich wohl eine Sache vergessen, da ich dachte, dass diese Information nicht so wichtig sei. Ich nutze keinen Webserver.
Ich möchte die Transformation lokal bzw. später über das Netzwerk durchführen.
Dementsprechend weiß ich nicht, wie ich dem Browser sagen soll, dass der richtige MIME Typ für .xhtml Dateien geliefert wird (application/xhtml+xml). Ich dachte, dass dies automatisch geschieht.
Nein, der Browser wirft nur die XML Maschinerie nur an, wenn es sich laut MIME Typ um XML Daten handelt. Ansonsten wird das Dokument einfach als eine Art von HTML verarbeitet.

Es sollte lokal funktionieren falls du die Endung von .xhtml in .xml änderst. \edit: Es sei denn, du verwendest Chrome, der weigert sich den Stylesheet zu laden...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: soa
Hallo,

danke für deine Rückmeldung. Im IE funktioniert die Endung .xml dahingehend, dass trotzdem das Javascript ausgeführt werden kann.
Der Firefox ist da etwas penibler, durch die Endung kann das JS nicht mehr ausgeführt werden. Beide Browser transformieren das XML nicht.

Wenn ich reines XML nehme, funktioniert es, mit HTML und JS zusammen leider nicht.

Vielleicht ist mein XSL:Output falsch ?

<xsl:eek:utput method="xml" encoding="iso-8859-1" />

Vielleicht kommt der Browser wegen des JS durcheinander und es geht nicht. Könntest Du bei Dir lokal noch einmal schauen, ob es klappt ? Ansonsten danke für Deine Hilfe.
 
Hallo,
danke für deine Rückmeldung...
Falls du mich meinst: Bitte sieh dir die beiden verlinkten Beispiele an, dort ist nirgendwo XSLT drin.
deepthroat hat schon erwähnt, dass die clientseitige Browserreaktion auf XSL sehr unterschiedlich ausfällt. Deshalb halte ich es für angebracht das alles besser mit Javascript per DOM zu erledigen. Das ist einfach sicherer und in den beiden verlinkten Beispielen wird das auch gemacht.
 
  • Gefällt mir
Reaktionen: soa

Neue Beiträge

Zurück