bloginista
Massimiliano Siddi
Home
  • Blog

HTML-Elemente aus der Ausgabe rausfiltern

25. März 2008 22:12 von madmax

Wenn man ein Webseitentemplate für papaya CMS schreibt, steht man bei bestimmten Inhalten oft vor dem Problem, dass man nicht alles per copy-of in die Seitenausgabe kopieren möchte. Insbesondere bei User-generierten Inhalten aus Foren möchte man bestimmte Elemente einfach "herausfischen". in XSLT hat man nun die Möglichkeit, das mode-Attribut zu benutzen, um in bestimmten Kontexten ein anderes Verhalten zu erreichen. Als Beispiel sei folgendes Seiten-XML dargestellt:

<page>
<content>
<topic>
<title>Testeintrag</title>
<text> Blabla bla bla foo baz bla:
<a href="http://link-zu-prime-porn-bullshit" >Klick mich!</a>
<br /><br />
Aber sonst geht's mir gut.
</text>
</topic>
</content>
</page>

Standardmäßig sollen redaktionelle Inhalte einfach in die Ausgabe durchgeschleift werden, wozu man entweder ein <xsl:copy-of> oder ein <xsl:apply-templates /> benutzen kann. Die erste Herangehensweise hat den Vorteil, dass sie recht performant ist, da der ausgewählte Teilbaum einfach in den Ergebnisbaum kopiert hat. Der Nachteil ist freilich, dass man die Kontrolle über die Inhalte aus der Hand gibt. Die zweite Herangehensweise veranlasst den XSLT-Prozessor, für jedes Element im Kontextknoten ein passendes Template aufzurufen. Man kann also für alle Elemente im Quellbaum eine entsprechende Behandlung erreichen, indem man beispielsweise <br />-Tags oder Ankerelemente einfach durchschleift, während bestimmte <span>-Tags ignoriert werden. Die entsprechenden Templates sehen wie folgt aus:

<-- Anker- und Break-Elemente durchschleifen -->
<xsl:template match="a|br">
<xsl:copy-of select="."/>
</xsl:template>

<-- Span-Elemente: nur den Textknoten übernehmen -->
<xsl:template match="span">
<xsl:value-of select="."/>
</xsl:template>

Das Problem hierbei ist jedoch, dass man je nach Kontextknoten entscheiden möchte, ob bestimmte Elemente einfach in den Ergebnisbaum kopiert werden sollen oder ob nur die Textknoten übernommen werden sollen. Für dieses Problem nun lässt sich das mode-Attribut benutzen. Neben den oben dargestellten Standard-Templates für Anker und Break erstellt man noch ein alternatives Template für HTML-Anker, dass nur die Testknoten ausgibt und noch das zusätzliche Attribut "mode" besitzt:


<-- Nur Textknoten von Ankerelementen erlauben -->
<xsl:template match="a" mode="filter">
<xsl:value-of select="."/>
</xsl:template>

Im entsprechenden Kontextknoten ruft man nun anstelle von <xsl:apply templates /> ein <xsl:apply-templates mode="Filter"/> auf, wenn man die Ausgabe von Links verhindern möchte. Dadurch wird stets dasjenige Template aufgerufen, dass diesen Modus im mode-Attribut enthält.

Details zum mode-Attribut könnt ihr der Recommendation auf den Seiten des W3-Konsortiums entnehmen.

Posted in XML, XSLT

Keine Kommentare


(Kommentarbereich geschlossen)

Neuere Einträge →