ChrisB: XHTML-Dokument mittels XSLT "erweitern:

Hi,

ich versuche ein XHTML-Dokument mittels XSLT zu "erweitern" - sprich, beim Auftauchen eines bestimmten Elements möchte ich dieses mit einem Container-Element einfassen.

Mein XHTML-Dokument:

<?xml version="1.0" encoding="utf-8"?>  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<title>Titel</title>  
</head>  
<body>  
  <div>  
    <h1>Überschrift</h1>  
    <p>Testabsatz.</p>  
  </div>  
  <p>Text, Text, Text</p>  
</body>  
</html>

In diesem möchte ich jetzt alle P-Elemente mit einem <div class="paragraph">...</div> umschliessen (nur als Beispiel!), d.h. als Ergebnis hätte ich gerne

<?xml version="1.0" encoding="utf-8"?>  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<title>Titel</title>  
</head>  
<body>  
  <div>  
    <h1>Überschrift</h1>  
    <div class="paragraph">  
      <p>Testabsatz.</p>  
    </div>  
  </div>  
  <div class="paragraph">  
    <p>Text, Text, Text</p>  
  </div>  
</body>  
</html>

Mein XSL-Stylesheet:

<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  
<xsl:template match="/">  
 <xsl:apply-templates />  
</xsl:template>  
  
<xsl:template match="p">  
 <div class="paragraph">  
  <xsl:apply-templates />  
 </div>  
</xsl:template>  
  
<xsl:template match="*">  
  <xsl:copy-of select="." />  
</xsl:template>  
  
</xsl:stylesheet>

(Die Tranformation führe ich momentan mittels PHPs XSLTProcessor->importStyleSheet und ->transformToXML(DOMDocument) durch; Kontrolle dann durch Ausgabe nach Behandlung mit htmlspecialchar.)

Leider erhalte ich nicht das gewünschte Ergebnis.

Lasse ich den letzten Teil im Stylesheet weg, <xsl:template match="*"> - dann bekomme ich nur noch die Textnodes ausgegeben, die Elemente fehlen vollständig.

Kommentiere ich <xsl:template match="p"> aus, erhalte ich keine Veränderung.
Also wird dieses Template gar nicht auf meine P-Elemente angewandt? Wenn nein, warum nicht?
Wird <xsl:template match="*"> auch auf meine P-Elemente angewandt, obwohl es nach meinem Verständnis "allgemeiner" sein sollte, und deshalb zuerst eigentlich <xsl:template match="p"> doch zuerst angewandt werden sollte, wenn es sich beim aktuellen Element um ein P handelt?

Müsste ich hier mit priority bei meinen Templates arbeiten? (So wie ich die Erklärung in SELFHTML verstanden habe, müsste doch match="p" automatisch eine höhere Priorität haben als match="*", oder?)

Wie bekomme ich es hin, dass beim Auftreten eines bestimmten Elements darum herum ein weiteres eingefügt wird, es selber und alle seine Nachfahren jedoch inkl. aller Attribute übernommen werden; und alle nicht betroffenen Elemente ausserhalb ebenfalls?

MfG ChrisB

--
Light travels faster than sound - that's why most people appear bright until you hear them speak.
  1. Hallo Chris,

    ich versuche ein XHTML-Dokument mittels XSLT zu "erweitern" - sprich, beim Auftauchen eines bestimmten Elements möchte ich dieses mit einem Container-Element einfassen.

    Probiere es so:

    <?xml version="1.0" encoding="UTF-8"?>  
    <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" version="1.0" encoding="UTF-8" indent="yes"/>  
      
      <xsl:template match="@* | node()">  
        <xsl:copy>  
          <xsl:apply-templates select="@* | node()"/>  
        </xsl:copy>  
      </xsl:template>  
      
      <xsl:template match="html:p">  
        <div class="paragraph">  
          <xsl:copy-of select="."/>  
        </div>  
      </xsl:template>  
      
    </xsl:stylesheet>
    

    Einerseits kommt das Identity-Template zum Einsatz, welches alle Inhalte 1:1 in die Ausgabe übernimmt und anderseits sollen p-Elemente gesondert behandelt werden, welche wiederum im Default-XML-Namespace liegen. Der Zugriff darauf erfolgt hier mittels html:p (Prefix beliebig wählbar). Die nochmalige Verwendung von xmlns="http://www.w3.org/1999/xhtml" als Default-Namensraum im Stylesheet vermeidet die Ausgabe von xmlns="" bei den neu erzeugten div-Elementen.

    Grüße,
    Thomas

    1. Hi Thomas,

      Probiere es so:

      Danke, das bewirkt erst mal das gewünschte.

      Einerseits kommt das Identity-Template zum Einsatz, welches alle Inhalte 1:1 in die Ausgabe übernimmt und anderseits sollen p-Elemente gesondert behandelt werden, welche wiederum im Default-XML-Namespace liegen. Der Zugriff darauf erfolgt hier mittels html:p (Prefix beliebig wählbar). Die nochmalige Verwendung von xmlns="http://www.w3.org/1999/xhtml" als Default-Namensraum im Stylesheet vermeidet die Ausgabe von xmlns="" bei den neu erzeugten div-Elementen.

      Werd' mal sehen, ob ich das auf den etwas komplexeren realen Einsatzfall übertragen kann, aber das klingt erst mal gut.

      MfG ChrisB

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.